From 02db637e61da9df590e18ead5cb4d9c28c944017 Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 1 Apr 2025 16:02:23 -0400 Subject: [PATCH 1/8] [ADD] auto_backup_fs_file: introduce Auto Backup Fs File module with initial files and configurations --- auto_backup_fs_file/README.rst | 265 ++++++++ auto_backup_fs_file/__init__.py | 1 + auto_backup_fs_file/__manifest__.py | 21 + auto_backup_fs_file/data/fs_storage_data.xml | 13 + .../data/mail_activity_type_data.xml | 10 + .../i18n/auto_backup_fs_file.pot | 313 +++++++++ auto_backup_fs_file/i18n/es.po | 293 ++++++++ auto_backup_fs_file/models/__init__.py | 2 + auto_backup_fs_file/models/db_backup.py | 128 ++++ .../models/db_backup_fs_file.py | 57 ++ auto_backup_fs_file/pyproject.toml | 3 + auto_backup_fs_file/readme/CONFIGURE.md | 23 + auto_backup_fs_file/readme/CONTEXT.md | 13 + auto_backup_fs_file/readme/CONTRIBUTORS.md | 1 + auto_backup_fs_file/readme/CREDITS.md | 3 + auto_backup_fs_file/readme/DESCRIPTION.md | 3 + auto_backup_fs_file/readme/INSTALL.md | 1 + auto_backup_fs_file/readme/ROADMAP.md | 3 + auto_backup_fs_file/readme/USAGE.md | 36 + .../security/ir.model.access.csv | 3 + .../description/db_backup_form_view.png | Bin 0 -> 78731 bytes .../db_backup_fs_file_tree_view.png | Bin 0 -> 59727 bytes .../file_storage_configuration.png | Bin 0 -> 118682 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 633 ++++++++++++++++++ auto_backup_fs_file/tests/__init__.py | 3 + .../tests/test_auto_backup_fs_file.py | 123 ++++ .../views/db_backup_fs_file_views.xml | 63 ++ auto_backup_fs_file/views/db_backup_views.xml | 44 ++ 29 files changed, 2058 insertions(+) create mode 100644 auto_backup_fs_file/README.rst create mode 100644 auto_backup_fs_file/__init__.py create mode 100644 auto_backup_fs_file/__manifest__.py create mode 100644 auto_backup_fs_file/data/fs_storage_data.xml create mode 100644 auto_backup_fs_file/data/mail_activity_type_data.xml create mode 100644 auto_backup_fs_file/i18n/auto_backup_fs_file.pot create mode 100644 auto_backup_fs_file/i18n/es.po create mode 100644 auto_backup_fs_file/models/__init__.py create mode 100644 auto_backup_fs_file/models/db_backup.py create mode 100644 auto_backup_fs_file/models/db_backup_fs_file.py create mode 100644 auto_backup_fs_file/pyproject.toml create mode 100644 auto_backup_fs_file/readme/CONFIGURE.md create mode 100644 auto_backup_fs_file/readme/CONTEXT.md create mode 100644 auto_backup_fs_file/readme/CONTRIBUTORS.md create mode 100644 auto_backup_fs_file/readme/CREDITS.md create mode 100644 auto_backup_fs_file/readme/DESCRIPTION.md create mode 100644 auto_backup_fs_file/readme/INSTALL.md create mode 100644 auto_backup_fs_file/readme/ROADMAP.md create mode 100644 auto_backup_fs_file/readme/USAGE.md create mode 100644 auto_backup_fs_file/security/ir.model.access.csv create mode 100644 auto_backup_fs_file/static/description/db_backup_form_view.png create mode 100644 auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png create mode 100644 auto_backup_fs_file/static/description/file_storage_configuration.png create mode 100644 auto_backup_fs_file/static/description/icon.png create mode 100644 auto_backup_fs_file/static/description/index.html create mode 100644 auto_backup_fs_file/tests/__init__.py create mode 100644 auto_backup_fs_file/tests/test_auto_backup_fs_file.py create mode 100644 auto_backup_fs_file/views/db_backup_fs_file_views.xml create mode 100644 auto_backup_fs_file/views/db_backup_views.xml diff --git a/auto_backup_fs_file/README.rst b/auto_backup_fs_file/README.rst new file mode 100644 index 00000000000..0b52bbbd1af --- /dev/null +++ b/auto_backup_fs_file/README.rst @@ -0,0 +1,265 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +=================== +Auto Backup Fs File +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ee3d4c88955253f4037b88f12085fc335206fe54512032059d08dddf4c753c51 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/17.0/auto_backup_fs_file + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-auto_backup_fs_file + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module enhances the database backup functionality in Odoo by +introducing support for storing backups as files using the ``fsspec`` +library. It is designed to address the need for reliable and flexible +backup solutions, enabling businesses to safeguard their data by storing +backups on various filesystems, including cloud storage providers, +network drives, and local secure storage. + +By integrating with the ``fs_file`` addon from the OCA storage +repository, this module allows users to automate the backup process and +store the resulting files in a configured filesystem. It provides an +easy-to-use interface for configuring backup methods, managing stored +backups, and ensuring data integrity for disaster recovery or +multi-environment setups. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +BUSINESS NEED: This module addresses the critical need for safeguarding +Odoo instance data by enabling automated backups to a filesystem +supported by the ``fsspec`` library. Businesses often require reliable +and accessible backup solutions to ensure data integrity and recovery in +case of system failures or data loss. This module is particularly useful +in contexts where organizations need to store backups on cloud storage, +network drives, or other custom filesystems supported by ``fsspec``. + +Practical examples include: + +- Backing up Odoo data to cloud storage providers like AWS S3, Google + Cloud Storage, or Azure Blob Storage. +- Storing backups on a secure local or remote filesystem for disaster + recovery purposes. +- Automating backup processes in multi-environment setups, such as + multi-company or multi-website configurations. + +APPROACH: The module extends the backup functionality from the +``auto_backup`` module by introducing a method that allows storing the +resulting backup using an ``fsspec`` implementation. This is achieved +through the integration of the ``fs_file`` from `storage +repository `__. The module leverages the +``fsspec`` library to provide a flexible and extensible interface for +interacting with various filesystems. It automates the backup process by +exporting Odoo instance data and storing it in the specified filesystem. +Additionally, it allows users to download the backups for local storage +or further processing. + +USEFUL INFORMATION: + +- **Dependencies**: This module depends on the ``fsspec`` library, its + relevant filesystem implementations, and the ``fs_file`` addon from + OCA/storage. Ensure the required ``fsspec`` plugins are installed for + your target filesystem. + +Installation +============ + +This addon itself does not introduce any dependencies, but its +dependencies may require additional packages.:wa + +Configuration +============= + +1. **Review Documentation for Dependencies** Before configuring the + module, ensure you have reviewed the documentation for the following + modules: + +- ``fs_attachment`` +- ``fs_storage`` These modules provide the necessary setup for file + storage and attachment handling. + +2. **Configure File Storage** + +- Navigate to **Settings** > **Technical** > **FS Storage**. +- Create or select an existing storage configuration. +- Ensure the storage is properly set up and tested for accessibility. + +3. **Link Backup File field to Storage** + +- While configuring the file storage in **Settings** > **Technical** > + **FS Storage**, ensure that the ``backup_file`` from the + ``db.backup.fs.file`` model is listed under the ``Field`` field. +- This step is part of the storage configuration process. +- Save the changes after verifying the setup. + +|Example of File Storage Configuration| + +4. **Verify Configuration** + +- Perform a test backup to ensure the files are being stored in the + correct location. +- Check the logs for any errors or warnings. + +By following these steps, you will ensure that the module is properly +configured for storing backups in the desired file storage system. + +.. |Example of File Storage Configuration| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/images/file_storage_configuration.png + +Usage +===== + +This module extends the functionality of the database backup system in +Odoo by introducing a new backup method: **Fs File**. This method allows +storing database backups as files using an FSSPEC implementation. + +How to Use the Module +--------------------- + +1. Configure the Backup Method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Navigate to **Settings** > **Technical** > **Database Structure** > + **Automated Backups**. +2. Create or edit a backup configuration. +3. In the **Backup Method** field, select **Fs File**. +4. Configure other fields as needed, such as the backup format and + retention settings. +5. Save the configuration. + +2. Perform a Backup +~~~~~~~~~~~~~~~~~~~ + +1. From the list of backup configurations, select the one configured + with the **Fs File** method. +2. Click the **Backup Now** button to initiate the backup process. +3. The backup will be stored as a file in the configured FSSPEC storage. + +3. View Fs File Backups +~~~~~~~~~~~~~~~~~~~~~~~ + +1. Open the backup configuration form view. +2. In the top-right corner, you will see a **Backups** stat button (if + backups exist). +3. Click the **Backups** button to view the list of Fs File backups + associated with the configuration. + +4. Manage Fs File Backups +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- In the Fs File backups list view, you can see details such as the + backup filename and associated database backup configuration. +- Use this view to manage or download backups as needed. + +Screenshots +~~~~~~~~~~~ + +- **Backup Configuration Form View** |Backup Configuration Form| + +- **Fs File Backups List View** |Fs File Backups List| + +Notes +~~~~~ + +- Ensure that the FSSPEC storage is properly configured before using the + **Fs File** method. +- This module adds a new stat button in the backup configuration form + view to quickly access Fs File backups. + +.. |Backup Configuration Form| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/static/description/db_backup_form_view.png +.. |Fs File Backups List| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png + +Known issues / Roadmap +====================== + +- **Folder field behavior**: The ``folder`` field on the ``db.backup`` + model specifies the backup storage directory. For records using the + ``fs_file`` method, storage is actually controlled by the ``fs_file`` + field's settings. However, since ``folder`` is currently a required + non-computed field in the ``auto_backup`` addon, modifications to sync + these two fields are not performed. Future versions may add this + synchronization support. + +- **Design limitation**: The current implementation has a design + constraint due to ``fs_storage`` addon limitations. Since storage + setting targets the ``db.backup.fs.file`` model, only one storage + backend can effectively be used. + +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 +------- + +* Binhex + +Contributors +------------ + +- Rolando Pérez Rebollo r.perez@binhex.cloud + +Other credits +------------- + +The development of this module has been financially supported by: + +- Binhex + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/auto_backup_fs_file/__init__.py b/auto_backup_fs_file/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/auto_backup_fs_file/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/auto_backup_fs_file/__manifest__.py b/auto_backup_fs_file/__manifest__.py new file mode 100644 index 00000000000..7c8490c8c9b --- /dev/null +++ b/auto_backup_fs_file/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2025 r.perez@binhex.cloud +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Auto Backup Fs File", + "summary": """Store backups using some FSSPEC implementation""", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "author": "Binhex,Odoo Community Association (OCA)", + "category": "Tools", + "website": "https://github.com/OCA/server-tools", + "depends": ["auto_backup", "fs_file", "mail"], + "development_status": "Alpha", + "data": [ + "data/mail_activity_type_data.xml", + "data/fs_storage_data.xml", + "security/ir.model.access.csv", + "views/db_backup_views.xml", + "views/db_backup_fs_file_views.xml", + ], +} diff --git a/auto_backup_fs_file/data/fs_storage_data.xml b/auto_backup_fs_file/data/fs_storage_data.xml new file mode 100644 index 00000000000..4eed67e9fb2 --- /dev/null +++ b/auto_backup_fs_file/data/fs_storage_data.xml @@ -0,0 +1,13 @@ + + + + + Odoo Filesystem Auto Backups Backend + odoofs + odoobackupfs + auto_backup_fs_file.field_db_backup_fs_file__backup_file + + diff --git a/auto_backup_fs_file/data/mail_activity_type_data.xml b/auto_backup_fs_file/data/mail_activity_type_data.xml new file mode 100644 index 00000000000..ef95e81f9c1 --- /dev/null +++ b/auto_backup_fs_file/data/mail_activity_type_data.xml @@ -0,0 +1,10 @@ + + + + + Download Backup + fa-download + db.backup.fs.file + + diff --git a/auto_backup_fs_file/i18n/auto_backup_fs_file.pot b/auto_backup_fs_file/i18n/auto_backup_fs_file.pot new file mode 100644 index 00000000000..6b3ef2b1c35 --- /dev/null +++ b/auto_backup_fs_file/i18n/auto_backup_fs_file.pot @@ -0,0 +1,313 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_backup_fs_file +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "Backup File" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__name +msgid "Backup Filename" +msgstr "" + +#. module: auto_backup_fs_file +#: model_terms:ir.ui.view,arch_db:auto_backup_fs_file.view_backup_conf_form +msgid "Backups" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__method +msgid "Choose the storage method for this backup." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_uid +msgid "Created by" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_date +msgid "Created on" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__db_backup_id +msgid "DB Backup" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup +msgid "Database Backup" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup_fs_file +msgid "Database Backup Files" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__display_name +msgid "Display Name" +msgstr "" + +#. module: auto_backup_fs_file +#: model:mail.activity.type,name:auto_backup_fs_file.mail_act_download_backup +msgid "Download Backup" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields.selection,name:auto_backup_fs_file.selection__db_backup__method__fs_file +msgid "Fs File" +msgstr "" + +#. module: auto_backup_fs_file +#. odoo-python +#: code:addons/auto_backup_fs_file/models/db_backup.py:0 +#, python-format +msgid "Fs File Backup - %s" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_count +msgid "Fs File Backup Count" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.actions.act_window,name:auto_backup_fs_file.db_backup_fs_file_act_window +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_ids +#: model:ir.ui.menu,name:auto_backup_fs_file.db_backup_fs_file_menu +msgid "Fs File Backups" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__has_message +msgid "Has Message" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__id +msgid "ID" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Indicates whether the backup has exceeded its storage time." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Is Expired" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_date +msgid "Last Updated on" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_ids +msgid "Messages" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__method +msgid "Method" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__responsible_id +msgid "Responsible" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__smart_search +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__smart_search +msgid "Smart Search" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "The file that contains the database backup" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__responsible_id +msgid "User to be notified." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: auto_backup_fs_file +#. odoo-python +#: code:addons/auto_backup_fs_file/models/db_backup.py:0 +#, python-format +msgid "" +"You must configure a FS Storage for the '%(model_description)s' model - or " +"'Backup File' - field to use the 'Fs File' backup method." +msgstr "" diff --git a/auto_backup_fs_file/i18n/es.po b/auto_backup_fs_file/i18n/es.po new file mode 100644 index 00000000000..ce977d6f5d1 --- /dev/null +++ b/auto_backup_fs_file/i18n/es.po @@ -0,0 +1,293 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_backup_fs_file +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-11-18 13:18+0000\n" +"PO-Revision-Date: 2025-11-18 13:18+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "Backup File" +msgstr "Archivo de copia de seguridad" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__name +msgid "Backup Filename" +msgstr "Nombre del archivo de copia de seguridad" + +#. module: auto_backup_fs_file +#: model_terms:ir.ui.view,arch_db:auto_backup_fs_file.view_backup_conf_form +msgid "Backups" +msgstr "Copias de seguridad" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__method +msgid "Choose the storage method for this backup." +msgstr "Elija el método de almacenamiento para esta copia de seguridad." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_uid +msgid "Created by" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_date +msgid "Created on" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__db_backup_id +msgid "DB Backup" +msgstr "Copia de seguridad de la base de datos" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup +msgid "Database Backup" +msgstr "Copia de seguridad de la base de datos" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup_fs_file +msgid "Database Backup Files" +msgstr "Archivos de copia de seguridad de la base de datos" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__display_name +msgid "Display Name" +msgstr "" + +#. module: auto_backup_fs_file +#: model:mail.activity.type,name:auto_backup_fs_file.mail_act_download_backup +msgid "Download Backup" +msgstr "Descargar copia de seguridad" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Contactos)" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields.selection,name:auto_backup_fs_file.selection__db_backup__method__fs_file +msgid "Fs File" +msgstr "Archivo FS" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_count +msgid "Fs File Backup Count" +msgstr "Conteo de copias de seguridad de archivos FS" + +#. module: auto_backup_fs_file +#: model:ir.actions.act_window,name:auto_backup_fs_file.db_backup_fs_file_act_window +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_ids +#: model:ir.ui.menu,name:auto_backup_fs_file.db_backup_fs_file_menu +msgid "Fs File Backups" +msgstr "Copias de seguridad de archivos FS" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__has_message +msgid "Has Message" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__id +msgid "ID" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Indicates whether the backup has exceeded its storage time." +msgstr "Indica si la copia de seguridad ha superado su tiempo de almacenamiento." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Is Expired" +msgstr "¿Está caducado?" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_date +msgid "Last Updated on" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_ids +msgid "Messages" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__method +msgid "Method" +msgstr "Método" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__responsible_id +msgid "Responsible" +msgstr "Responsable" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "The file that contains the database backup" +msgstr "El archivo que contiene la copia de seguridad de la base de datos" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__responsible_id +msgid "User to be notified." +msgstr "Usuario a ser notificado." + +#. module: auto_backup_fs_file +#. odoo-python +#: code:addons/auto_backup_fs_file/models/db_backup.py:0 +#, python-format +msgid "" +"You must configure a FS Storage for the '%(model_description)s' model - or " +"'Backup File' - field to use the 'Fs File' backup method." +msgstr "Debe configurar un almacenamiento FS para el modelo '%(model_description)s'" +" o para el campo 'Archivo de copia de seguridad' para utilizar el método de copia de seguridad 'Fs File'." diff --git a/auto_backup_fs_file/models/__init__.py b/auto_backup_fs_file/models/__init__.py new file mode 100644 index 00000000000..d0cb75951a9 --- /dev/null +++ b/auto_backup_fs_file/models/__init__.py @@ -0,0 +1,2 @@ +from . import db_backup_fs_file +from . import db_backup diff --git a/auto_backup_fs_file/models/db_backup.py b/auto_backup_fs_file/models/db_backup.py new file mode 100644 index 00000000000..7e1411e80bd --- /dev/null +++ b/auto_backup_fs_file/models/db_backup.py @@ -0,0 +1,128 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from markupsafe import Markup + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.service import db + +from odoo.addons.fs_file.fields import FSFileValue + + +class DbBackup(models.Model): + _inherit = "db.backup" + + method = fields.Selection( + selection_add=[("fs_file", "Fs File")], ondelete={"fs_file": "cascade"} + ) + + fs_file_backup_ids = fields.One2many( + comodel_name="db.backup.fs.file", + inverse_name="db_backup_id", + string="Fs File Backups", + ) + + fs_file_backup_count = fields.Integer(compute="_compute_fs_file_backup_count") + + responsible_id = fields.Many2one("res.users", help="User to be notified.") + + @api.model + def _get_fs_storage(self): + """Get the fs_storage to be used for fs_file backups.""" + DbBackupFsFile = self.env["db.backup.fs.file"] + return DbBackupFsFile.fs_storage() + + def _compute_name(self): + res = super()._compute_name() + for record in self.filtered(lambda r: r.method == "fs_file"): + record.name = _("Fs File Backup - %s", record._get_fs_storage().name) + return res + + @api.depends("fs_file_backup_ids") + def _compute_fs_file_backup_count(self): + """Compute the count of fs_file backups.""" + for record in self: + record.fs_file_backup_count = len(record.fs_file_backup_ids) + + @api.constrains("method") + def _check_fs_file_backup_storage(self): + """Ensure that fs_file method has a storage configured.""" + for record in self.filtered(lambda r: r.method == "fs_file"): + if not record._get_fs_storage(): + raise ValidationError( + _( + "You must configure a FS Storage for the " + "'%(model_description)s' model - or 'Backup File' - field" + " to use the 'Fs File'" + " backup method.", + model_description=self.fs_file_backup_ids._description, + ) + ) + + def action_backup(self): + """Override the action_backup method to add the fs_file method.""" + fs_backups = self.filtered(lambda it: it.method == "fs_file") + dbname = self.env.cr.dbname + for fs_backup in fs_backups: + with fs_backup.backup_log(): + filename = self.filename( + fields.Datetime.now(), ext=fs_backup.backup_format + ) + backup = self.env["db.backup.fs.file"].create( + { + "name": filename, + "db_backup_id": fs_backup.id, + "backup_file": FSFileValue( + name=filename, + value=b"init file", + ), + } + ) + with backup.backup_file.open("wb", new_version=False) as f: + db.dump_db(dbname, f, fs_backup.backup_format) + user_to_notify = fs_backup.responsible_id or self.env.user + file_metadata = backup.read(["backup_file"])[0].get("backup_file") + base_url = ( + self.env["ir.config_parameter"].sudo().get_param("web.base.url") + ) + activity_note = Markup( + _( + "The database backup '%(backup_name)s' is ready." + " You can download it from the attachment link: " + "" + "%(download_link)s", + backup_name=backup.name, + download_link=f"{base_url}{file_metadata.get('url')}", + ) + ) + backup.activity_schedule( + "auto_backup_fs_file.mail_act_download_backup", + date_deadline=fields.Date.today(), + note=activity_note, + summary=_("Database backup is ready to download."), + user_id=user_to_notify.id, + ) + res = super().action_backup() + return res + + def action_open_fs_backups_view(self): + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id( + "auto_backup_fs_file.db_backup_fs_file_act_window" + ) + action["domain"] = [("db_backup_id", "=", self.id)] + return action + + def cleanup(self): + """Extend cleanup to fs_file backups.""" + for db_backup_conf in self.filtered( + lambda record: record.method == "fs_file" and record.days_to_keep + ): + with db_backup_conf.cleanup_log(): + to_delete = db_backup_conf.fs_file_backup_ids.filtered("is_expired") + for backup in to_delete: + self._get_fs_storage().fs.rm_file(backup.get_fs_storage_filename()) + to_delete.unlink() + res = super().cleanup() + return res diff --git a/auto_backup_fs_file/models/db_backup_fs_file.py b/auto_backup_fs_file/models/db_backup_fs_file.py new file mode 100644 index 00000000000..4934b400845 --- /dev/null +++ b/auto_backup_fs_file/models/db_backup_fs_file.py @@ -0,0 +1,57 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + +from odoo.addons.fs_file import fields as fs_fields + + +class DbBackupFsFile(models.Model): + _name = "db.backup.fs.file" + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = "Database Backup Files" + + name = fields.Char("Backup Filename", required=True) + db_backup_id = fields.Many2one("db.backup", string="DB Backup", required=True) + backup_file = fs_fields.FSFile( + required=False, + help="The file that contains the database backup", + ) + is_expired = fields.Boolean( + compute="_compute_is_expired", + help="Indicates whether the backup has exceeded its storage time.", + ) + + def _compute_is_expired(self): + """Compute whether the backup has exceeded its storage time.""" + for record in self: + days_to_keep = record.db_backup_id.days_to_keep + if days_to_keep: + expiration_date = fields.Datetime.add( + record.create_date, days=days_to_keep + ) + record.is_expired = fields.Datetime.now() > expiration_date + else: + record.is_expired = False + + @api.model + def fs_storage(self): + FsStorage = self.env["fs.storage"] + fs_storages = FsStorage.search([]) + fs_storage = fs_storages.filtered( + lambda item: item.field_xmlids + and "auto_backup_fs_file.field_db_backup_fs_file__backup_file" + in item.field_xmlids + ) + if not fs_storage: + fs_storage = fs_storages.filtered( + lambda item: item.model_xmlids + and "auto_backup_fs_file.model_db_backup_fs_file" in item.model_xmlids + ) + if fs_storage: + return fs_storage + return False + + def get_fs_storage_filename(self): + self.ensure_one() + return self.backup_file.attachment.store_fname.split("://")[-1] diff --git a/auto_backup_fs_file/pyproject.toml b/auto_backup_fs_file/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/auto_backup_fs_file/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/auto_backup_fs_file/readme/CONFIGURE.md b/auto_backup_fs_file/readme/CONFIGURE.md new file mode 100644 index 00000000000..26b4c2ae26a --- /dev/null +++ b/auto_backup_fs_file/readme/CONFIGURE.md @@ -0,0 +1,23 @@ +1. **Review Documentation for Dependencies** + Before configuring the module, ensure you have reviewed the documentation for the following modules: + - `fs_attachment` + - `fs_storage` + These modules provide the necessary setup for file storage and attachment handling. + +2. **Configure File Storage** + - Navigate to **Settings** > **Technical** > **FS Storage**. + - Create or select an existing storage configuration. + - Ensure the storage is properly set up and tested for accessibility. + +3. **Link Backup File field to Storage** + - While configuring the file storage in **Settings** > **Technical** > **FS Storage**, ensure that the `backup_file` from the `db.backup.fs.file` model is listed under the `Field` field. + - This step is part of the storage configuration process. + - Save the changes after verifying the setup. + + ![Example of File Storage Configuration](../images/file_storage_configuration.png) + +4. **Verify Configuration** + - Perform a test backup to ensure the files are being stored in the correct location. + - Check the logs for any errors or warnings. + +By following these steps, you will ensure that the module is properly configured for storing backups in the desired file storage system. diff --git a/auto_backup_fs_file/readme/CONTEXT.md b/auto_backup_fs_file/readme/CONTEXT.md new file mode 100644 index 00000000000..fe771bb0775 --- /dev/null +++ b/auto_backup_fs_file/readme/CONTEXT.md @@ -0,0 +1,13 @@ +BUSINESS NEED: +This module addresses the critical need for safeguarding Odoo instance data by enabling automated backups to a filesystem supported by the `fsspec` library. Businesses often require reliable and accessible backup solutions to ensure data integrity and recovery in case of system failures or data loss. This module is particularly useful in contexts where organizations need to store backups on cloud storage, network drives, or other custom filesystems supported by `fsspec`. + +Practical examples include: +- Backing up Odoo data to cloud storage providers like AWS S3, Google Cloud Storage, or Azure Blob Storage. +- Storing backups on a secure local or remote filesystem for disaster recovery purposes. +- Automating backup processes in multi-environment setups, such as multi-company or multi-website configurations. + +APPROACH: +The module extends the backup functionality from the `auto_backup` module by introducing a method that allows storing the resulting backup using an `fsspec` implementation. This is achieved through the integration of the `fs_file` from [storage repository](https://github.com/OCA/storage). The module leverages the `fsspec` library to provide a flexible and extensible interface for interacting with various filesystems. It automates the backup process by exporting Odoo instance data and storing it in the specified filesystem. Additionally, it allows users to download the backups for local storage or further processing. + +USEFUL INFORMATION: +- **Dependencies**: This module depends on the `fsspec` library, its relevant filesystem implementations, and the `fs_file` addon from OCA/storage. Ensure the required `fsspec` plugins are installed for your target filesystem. diff --git a/auto_backup_fs_file/readme/CONTRIBUTORS.md b/auto_backup_fs_file/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..f8e1ad8bfa1 --- /dev/null +++ b/auto_backup_fs_file/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Rolando Pérez Rebollo diff --git a/auto_backup_fs_file/readme/CREDITS.md b/auto_backup_fs_file/readme/CREDITS.md new file mode 100644 index 00000000000..95aa18652f8 --- /dev/null +++ b/auto_backup_fs_file/readme/CREDITS.md @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +- Binhex diff --git a/auto_backup_fs_file/readme/DESCRIPTION.md b/auto_backup_fs_file/readme/DESCRIPTION.md new file mode 100644 index 00000000000..c1ea900109a --- /dev/null +++ b/auto_backup_fs_file/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module enhances the database backup functionality in Odoo by introducing support for storing backups as files using the `fsspec` library. It is designed to address the need for reliable and flexible backup solutions, enabling businesses to safeguard their data by storing backups on various filesystems, including cloud storage providers, network drives, and local secure storage. + +By integrating with the `fs_file` addon from the OCA storage repository, this module allows users to automate the backup process and store the resulting files in a configured filesystem. It provides an easy-to-use interface for configuring backup methods, managing stored backups, and ensuring data integrity for disaster recovery or multi-environment setups. diff --git a/auto_backup_fs_file/readme/INSTALL.md b/auto_backup_fs_file/readme/INSTALL.md new file mode 100644 index 00000000000..f60d5acfaa5 --- /dev/null +++ b/auto_backup_fs_file/readme/INSTALL.md @@ -0,0 +1 @@ +This addon itself does not introduce any dependencies, but its dependencies may require additional packages.:wa diff --git a/auto_backup_fs_file/readme/ROADMAP.md b/auto_backup_fs_file/readme/ROADMAP.md new file mode 100644 index 00000000000..a3a695bc2b8 --- /dev/null +++ b/auto_backup_fs_file/readme/ROADMAP.md @@ -0,0 +1,3 @@ +- **Folder field behavior**: The `folder` field on the `db.backup` model specifies the backup storage directory. For records using the `fs_file` method, storage is actually controlled by the `fs_file` field's settings. However, since `folder` is currently a required non-computed field in the `auto_backup` addon, modifications to sync these two fields are not performed. Future versions may add this synchronization support. + +- **Design limitation**: The current implementation has a design constraint due to `fs_storage` addon limitations. Since storage setting targets the `db.backup.fs.file` model, only one storage backend can effectively be used. diff --git a/auto_backup_fs_file/readme/USAGE.md b/auto_backup_fs_file/readme/USAGE.md new file mode 100644 index 00000000000..b1b2cc0a190 --- /dev/null +++ b/auto_backup_fs_file/readme/USAGE.md @@ -0,0 +1,36 @@ +This module extends the functionality of the database backup system in Odoo by introducing a new backup method: **Fs File**. This method allows storing database backups as files using an FSSPEC implementation. + +## How to Use the Module + +### 1. Configure the Backup Method +1. Navigate to **Settings** > **Technical** > **Database Structure** > **Automated Backups**. +2. Create or edit a backup configuration. +3. In the **Backup Method** field, select **Fs File**. +4. Configure other fields as needed, such as the backup format and retention settings. +5. Save the configuration. + +### 2. Perform a Backup +1. From the list of backup configurations, select the one configured with the **Fs File** method. +2. Click the **Backup Now** button to initiate the backup process. +3. The backup will be stored as a file in the configured FSSPEC storage. + +### 3. View Fs File Backups +1. Open the backup configuration form view. +2. In the top-right corner, you will see a **Backups** stat button (if backups exist). +3. Click the **Backups** button to view the list of Fs File backups associated with the configuration. + +### 4. Manage Fs File Backups +- In the Fs File backups list view, you can see details such as the backup filename and associated database backup configuration. +- Use this view to manage or download backups as needed. + +### Screenshots +- **Backup Configuration Form View** + ![Backup Configuration Form](../static/description/db_backup_form_view.png) + +- **Fs File Backups List View** + ![Fs File Backups List](../static/description/db_backup_fs_file_tree_view.png) + +### Notes +- Ensure that the FSSPEC storage is properly configured before using the **Fs File** method. +- This module adds a new stat button in the backup configuration form view to quickly access Fs File backups. + diff --git a/auto_backup_fs_file/security/ir.model.access.csv b/auto_backup_fs_file/security/ir.model.access.csv new file mode 100644 index 00000000000..9ababe18d50 --- /dev/null +++ b/auto_backup_fs_file/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_db_backup_fs_file_read,Read db.backup fs.file,model_db_backup_fs_file,base.group_erp_manager,1,0,0,0 +access_db_backup_fs_file_write,Write db.backup fs.file,model_db_backup_fs_file,base.group_system,1,1,1,1 diff --git a/auto_backup_fs_file/static/description/db_backup_form_view.png b/auto_backup_fs_file/static/description/db_backup_form_view.png new file mode 100644 index 0000000000000000000000000000000000000000..98881da236a2a3b6ca2da0024b460397b4eea590 GIT binary patch literal 78731 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 CvD^g! literal 0 HcmV?d00001 diff --git a/auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png b/auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png new file mode 100644 index 0000000000000000000000000000000000000000..ca37b3161881a1bbcd05c0f87191c547aa8e9a36 GIT binary patch literal 59727 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 literal 0 HcmV?d00001 diff --git a/auto_backup_fs_file/static/description/icon.png b/auto_backup_fs_file/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/auto_backup_fs_file/static/description/index.html b/auto_backup_fs_file/static/description/index.html new file mode 100644 index 00000000000..967556011f1 --- /dev/null +++ b/auto_backup_fs_file/static/description/index.html @@ -0,0 +1,633 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Auto Backup Fs File

+ +

Alpha License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

This module enhances the database backup functionality in Odoo by +introducing support for storing backups as files using the fsspec +library. It is designed to address the need for reliable and flexible +backup solutions, enabling businesses to safeguard their data by storing +backups on various filesystems, including cloud storage providers, +network drives, and local secure storage.

+

By integrating with the fs_file addon from the OCA storage +repository, this module allows users to automate the backup process and +store the resulting files in a configured filesystem. It provides an +easy-to-use interface for configuring backup methods, managing stored +backups, and ensuring data integrity for disaster recovery or +multi-environment setups.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Use Cases / Context

+

BUSINESS NEED: This module addresses the critical need for safeguarding +Odoo instance data by enabling automated backups to a filesystem +supported by the fsspec library. Businesses often require reliable +and accessible backup solutions to ensure data integrity and recovery in +case of system failures or data loss. This module is particularly useful +in contexts where organizations need to store backups on cloud storage, +network drives, or other custom filesystems supported by fsspec.

+

Practical examples include:

+
    +
  • Backing up Odoo data to cloud storage providers like AWS S3, Google +Cloud Storage, or Azure Blob Storage.
  • +
  • Storing backups on a secure local or remote filesystem for disaster +recovery purposes.
  • +
  • Automating backup processes in multi-environment setups, such as +multi-company or multi-website configurations.
  • +
+

APPROACH: The module extends the backup functionality from the +auto_backup module by introducing a method that allows storing the +resulting backup using an fsspec implementation. This is achieved +through the integration of the fs_file from storage +repository. The module leverages the +fsspec library to provide a flexible and extensible interface for +interacting with various filesystems. It automates the backup process by +exporting Odoo instance data and storing it in the specified filesystem. +Additionally, it allows users to download the backups for local storage +or further processing.

+

USEFUL INFORMATION:

+
    +
  • Dependencies: This module depends on the fsspec library, its +relevant filesystem implementations, and the fs_file addon from +OCA/storage. Ensure the required fsspec plugins are installed for +your target filesystem.
  • +
+
+
+

Installation

+

This addon itself does not introduce any dependencies, but its +dependencies may require additional packages.:wa

+
+
+

Configuration

+
    +
  1. Review Documentation for Dependencies Before configuring the +module, ensure you have reviewed the documentation for the following +modules:
  2. +
+
    +
  • fs_attachment
  • +
  • fs_storage These modules provide the necessary setup for file +storage and attachment handling.
  • +
+
    +
  1. Configure File Storage
  2. +
+
    +
  • Navigate to Settings > Technical > FS Storage.
  • +
  • Create or select an existing storage configuration.
  • +
  • Ensure the storage is properly set up and tested for accessibility.
  • +
+
    +
  1. Link Backup File field to Storage
  2. +
+
    +
  • While configuring the file storage in Settings > Technical > +FS Storage, ensure that the backup_file from the +db.backup.fs.file model is listed under the Field field.
  • +
  • This step is part of the storage configuration process.
  • +
  • Save the changes after verifying the setup.
  • +
+

Example of File Storage Configuration

+
    +
  1. Verify Configuration
  2. +
+
    +
  • Perform a test backup to ensure the files are being stored in the +correct location.
  • +
  • Check the logs for any errors or warnings.
  • +
+

By following these steps, you will ensure that the module is properly +configured for storing backups in the desired file storage system.

+
+
+

Usage

+

This module extends the functionality of the database backup system in +Odoo by introducing a new backup method: Fs File. This method allows +storing database backups as files using an FSSPEC implementation.

+
+

How to Use the Module

+
+

1. Configure the Backup Method

+
    +
  1. Navigate to Settings > Technical > Database Structure > +Automated Backups.
  2. +
  3. Create or edit a backup configuration.
  4. +
  5. In the Backup Method field, select Fs File.
  6. +
  7. Configure other fields as needed, such as the backup format and +retention settings.
  8. +
  9. Save the configuration.
  10. +
+
+
+

2. Perform a Backup

+
    +
  1. From the list of backup configurations, select the one configured +with the Fs File method.
  2. +
  3. Click the Backup Now button to initiate the backup process.
  4. +
  5. The backup will be stored as a file in the configured FSSPEC storage.
  6. +
+
+
+

3. View Fs File Backups

+
    +
  1. Open the backup configuration form view.
  2. +
  3. In the top-right corner, you will see a Backups stat button (if +backups exist).
  4. +
  5. Click the Backups button to view the list of Fs File backups +associated with the configuration.
  6. +
+
+
+

4. Manage Fs File Backups

+
    +
  • In the Fs File backups list view, you can see details such as the +backup filename and associated database backup configuration.
  • +
  • Use this view to manage or download backups as needed.
  • +
+
+
+

Screenshots

+
    +
  • Backup Configuration Form View Backup Configuration Form
  • +
  • Fs File Backups List View Fs File Backups List
  • +
+
+
+

Notes

+
    +
  • Ensure that the FSSPEC storage is properly configured before using the +Fs File method.
  • +
  • This module adds a new stat button in the backup configuration form +view to quickly access Fs File backups.
  • +
+
+
+
+
+

Known issues / Roadmap

+
    +
  • Folder field behavior: The folder field on the db.backup +model specifies the backup storage directory. For records using the +fs_file method, storage is actually controlled by the fs_file +field’s settings. However, since folder is currently a required +non-computed field in the auto_backup addon, modifications to sync +these two fields are not performed. Future versions may add this +synchronization support.
  • +
  • Design limitation: The current implementation has a design +constraint due to fs_storage addon limitations. Since storage +setting targets the db.backup.fs.file model, only one storage +backend can effectively be used.
  • +
+
+
+

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

+
    +
  • Binhex
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+
    +
  • Binhex
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

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

+

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

+
+
+
+
+ + diff --git a/auto_backup_fs_file/tests/__init__.py b/auto_backup_fs_file/tests/__init__.py new file mode 100644 index 00000000000..0f334ca0fa9 --- /dev/null +++ b/auto_backup_fs_file/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_auto_backup_fs_file diff --git a/auto_backup_fs_file/tests/test_auto_backup_fs_file.py b/auto_backup_fs_file/tests/test_auto_backup_fs_file.py new file mode 100644 index 00000000000..d169e8e6132 --- /dev/null +++ b/auto_backup_fs_file/tests/test_auto_backup_fs_file.py @@ -0,0 +1,123 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later[](https://www.gnu.org/licenses/agpl). + +import io + +from odoo import fields +from odoo.exceptions import ValidationError +from odoo.service import db +from odoo.tests import tagged + +from odoo.addons.base.tests.common import BaseCommon + + +@tagged("post_install", "-at_install") +class TestAutoBackupFsFile(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.DbBackup = cls.env["db.backup"] + cls.DbBackupFsFile = cls.env["db.backup.fs.file"] + cls.FsStorage = cls.env["fs.storage"] + + cls.env.ref("auto_backup_fs_file.fs_storage_auto_backup").unlink() + + # Create a test FS Storage + cls.test_storage = cls.FsStorage.create( + { + "name": "Test Storage", + "protocol": "memory", # Use in-memory for testing + "code": "mem_dir", + "directory_path": "/tmp/", + } + ) + + def setUp(self): + super().setUp() + # Patch db.dump_db to avoid actual DB dumping (active for the entire test) + self.patch( + db, + "dump_db", + lambda dbname, stream, backup_format: io.BytesIO(b"fake_backup_data"), + ) + + def _create_backup_config(self): + # Create a test backup configuration with fs_file method + return self.DbBackup.create( + { + "method": "fs_file", + "backup_format": "zip", + "days_to_keep": 7, + "responsible_id": self.env.user.id, + } + ) + + def _action_backup(self, backup_config): + backup_config.action_backup() + + def test_ordinary_flow(self): + """Test the ordinary flow of creating a backup configuration and performing + backups.""" + # Create backup configuration, field not linked to storage yet + with self.assertRaises(ValidationError): + self._create_backup_config() + + self.test_storage.field_xmlids = ( + "auto_backup_fs_file.field_db_backup_fs_file__backup_file" + ) + backup_config = self._create_backup_config() + self.assertEqual( + backup_config.name, + f"Fs File Backup - {backup_config._get_fs_storage().name}", + ) + + # Test computation of fs_file_backup_count + self.assertEqual(backup_config.fs_file_backup_count, 0) + + # Test backup generation and activity creation + self._action_backup( + backup_config + ) # No need for _action_backup_with_time_freeze + self.assertEqual(backup_config.fs_file_backup_count, 1) + + # Check activity scheduled + activity = self.env["mail.activity"].search( + [ + ("res_model", "=", "db.backup.fs.file"), + ("res_id", "=", backup_config.fs_file_backup_ids.id), + ( + "activity_type_id", + "=", + self.env.ref("auto_backup_fs_file.mail_act_download_backup").id, + ), + ] + ) + self.assertTrue(activity) + self.assertEqual(activity.user_id, self.env.user) + self.assertFalse( + backup_config.fs_file_backup_ids.is_expired + ) # Without active mock, not expired + backup_config.cleanup() + self.assertEqual(backup_config.fs_file_backup_count, 1) + + # Get the fs_backup for expiry testing + fs_backup = backup_config.fs_file_backup_ids + + # Compute the expiration date + computed_now = fields.Datetime.add( + fs_backup.create_date, days=backup_config.days_to_keep, seconds=10 + ) + + def fake_now(): + return computed_now + + # Use self.patch to mock ONLY Datetime.now() for the duration of the test + self.patch(fields.Datetime, "now", fake_now) + fs_backup.invalidate_recordset(["is_expired"]) + + self.assertTrue( + fs_backup.is_expired + ) # Triggers _compute_is_expired with mocked now + backup_config.cleanup() # Will use the computed is_expired + + self.assertEqual(backup_config.fs_file_backup_count, 0) diff --git a/auto_backup_fs_file/views/db_backup_fs_file_views.xml b/auto_backup_fs_file/views/db_backup_fs_file_views.xml new file mode 100644 index 00000000000..e1652283de5 --- /dev/null +++ b/auto_backup_fs_file/views/db_backup_fs_file_views.xml @@ -0,0 +1,63 @@ + + + + + + db.backup.fs.file.form.view + db.backup.fs.file + +
+
+ + + + + + + + +
+ + + +
+ + + + + + db.backup.fs.file.search.view + db.backup.fs.file + + + + + + + + + db.backup.fs.file.tree.view + db.backup.fs.file + + + + + + + + + + + Fs File Backups + db.backup.fs.file + + + + Fs File Backups + + + + + + diff --git a/auto_backup_fs_file/views/db_backup_views.xml b/auto_backup_fs_file/views/db_backup_views.xml new file mode 100644 index 00000000000..1bbe336b90e --- /dev/null +++ b/auto_backup_fs_file/views/db_backup_views.xml @@ -0,0 +1,44 @@ + + + + + + db.backup + + + +
+ +
+
+ + + + +
+ + + + db.backup + + + + + + + + +
From 8c4afd81edee1f7f4aae5233b3bede44b95a8162 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 26 Jan 2026 08:46:44 +0000 Subject: [PATCH 2/8] Added translation using Weblate (Italian) --- auto_backup_fs_file/i18n/it.po | 323 +++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 auto_backup_fs_file/i18n/it.po diff --git a/auto_backup_fs_file/i18n/it.po b/auto_backup_fs_file/i18n/it.po new file mode 100644 index 00000000000..76b7f47905b --- /dev/null +++ b/auto_backup_fs_file/i18n/it.po @@ -0,0 +1,323 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_backup_fs_file +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-02-10 11:50+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "Backup File" +msgstr "File di backup" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__name +msgid "Backup Filename" +msgstr "Nome file backup" + +#. module: auto_backup_fs_file +#: model_terms:ir.ui.view,arch_db:auto_backup_fs_file.view_backup_conf_form +msgid "Backups" +msgstr "Backup" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__method +msgid "Choose the storage method for this backup." +msgstr "Scegliere il metodo di archiviazione per questo backup." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__db_backup_id +msgid "DB Backup" +msgstr "Backup DB" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup +msgid "Database Backup" +msgstr "Backup database" + +#. module: auto_backup_fs_file +#: model:ir.model,name:auto_backup_fs_file.model_db_backup_fs_file +msgid "Database Backup Files" +msgstr "File backup database" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: auto_backup_fs_file +#: model:mail.activity.type,name:auto_backup_fs_file.mail_act_download_backup +msgid "Download Backup" +msgstr "Scarica backup" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: auto_backup_fs_file +#: model:ir.model.fields.selection,name:auto_backup_fs_file.selection__db_backup__method__fs_file +msgid "Fs File" +msgstr "File FS" + +#. module: auto_backup_fs_file +#. odoo-python +#: code:addons/auto_backup_fs_file/models/db_backup.py:0 +#, python-format +msgid "Fs File Backup - %s" +msgstr "Backup file FS - %s" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_count +msgid "Fs File Backup Count" +msgstr "Conteggio backup file FS" + +#. module: auto_backup_fs_file +#: model:ir.actions.act_window,name:auto_backup_fs_file.db_backup_fs_file_act_window +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__fs_file_backup_ids +#: model:ir.ui.menu,name:auto_backup_fs_file.db_backup_fs_file_menu +msgid "Fs File Backups" +msgstr "Backup file FS" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__id +msgid "ID" +msgstr "ID" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Indicates whether the backup has exceeded its storage time." +msgstr "Indica se il backup ha superato il suo orario di archivio." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__is_expired +msgid "Is Expired" +msgstr "È scatuto" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__method +msgid "Method" +msgstr "Metodo" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__responsible_id +msgid "Responsible" +msgstr "Responsabile" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__message_has_sms_error +msgid "SMS Delivery error" +msgstr "Errore consegna SMS" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup__smart_search +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__smart_search +msgid "Smart Search" +msgstr "Ricerca intelligente" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__backup_file +msgid "The file that contains the database backup" +msgstr "Il file che contiene il backup del database" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup__responsible_id +msgid "User to be notified." +msgstr "Utente da avvisare." + +#. module: auto_backup_fs_file +#: model:ir.model.fields,field_description:auto_backup_fs_file.field_db_backup_fs_file__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: auto_backup_fs_file +#: model:ir.model.fields,help:auto_backup_fs_file.field_db_backup_fs_file__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: auto_backup_fs_file +#. odoo-python +#: code:addons/auto_backup_fs_file/models/db_backup.py:0 +#, python-format +msgid "" +"You must configure a FS Storage for the '%(model_description)s' model - or " +"'Backup File' - field to use the 'Fs File' backup method." +msgstr "" +"È necessario configurare un archivio FS per il modello '%(model_description)" +"s', o il campo 'File di backup', per utilizzare il metodo di backup 'File " +"FS'." From 1700cf13625184c3204df373c0a1686a5d658a02 Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Wed, 20 May 2026 20:09:01 -0400 Subject: [PATCH 3/8] [MIG] auto_backup_fs_file: Migration to 16.0 (backport) --- auto_backup_fs_file/README.rst | 111 +++++++++--------- auto_backup_fs_file/__manifest__.py | 2 +- .../static/description/index.html | 20 ++-- auto_backup_fs_file/views/db_backup_views.xml | 2 +- .../odoo/addons/auto_backup_fs_file | 1 + setup/auto_backup_fs_file/setup.py | 6 + 6 files changed, 74 insertions(+), 68 deletions(-) create mode 120000 setup/auto_backup_fs_file/odoo/addons/auto_backup_fs_file create mode 100644 setup/auto_backup_fs_file/setup.py diff --git a/auto_backup_fs_file/README.rst b/auto_backup_fs_file/README.rst index 0b52bbbd1af..43d583eac20 100644 --- a/auto_backup_fs_file/README.rst +++ b/auto_backup_fs_file/README.rst @@ -21,13 +21,13 @@ Auto Backup Fs File :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github - :target: https://github.com/OCA/server-tools/tree/17.0/auto_backup_fs_file + :target: https://github.com/OCA/server-tools/tree/16.0/auto_backup_fs_file :alt: OCA/server-tools .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-auto_backup_fs_file + :target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-auto_backup_fs_file :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -69,12 +69,12 @@ network drives, or other custom filesystems supported by ``fsspec``. Practical examples include: -- Backing up Odoo data to cloud storage providers like AWS S3, Google - Cloud Storage, or Azure Blob Storage. -- Storing backups on a secure local or remote filesystem for disaster - recovery purposes. -- Automating backup processes in multi-environment setups, such as - multi-company or multi-website configurations. +- Backing up Odoo data to cloud storage providers like AWS S3, Google + Cloud Storage, or Azure Blob Storage. +- Storing backups on a secure local or remote filesystem for disaster + recovery purposes. +- Automating backup processes in multi-environment setups, such as + multi-company or multi-website configurations. APPROACH: The module extends the backup functionality from the ``auto_backup`` module by introducing a method that allows storing the @@ -89,10 +89,10 @@ or further processing. USEFUL INFORMATION: -- **Dependencies**: This module depends on the ``fsspec`` library, its - relevant filesystem implementations, and the ``fs_file`` addon from - OCA/storage. Ensure the required ``fsspec`` plugins are installed for - your target filesystem. +- **Dependencies**: This module depends on the ``fsspec`` library, its + relevant filesystem implementations, and the ``fs_file`` addon from + OCA/storage. Ensure the required ``fsspec`` plugins are installed for + your target filesystem. Installation ============ @@ -107,37 +107,36 @@ Configuration module, ensure you have reviewed the documentation for the following modules: -- ``fs_attachment`` -- ``fs_storage`` These modules provide the necessary setup for file - storage and attachment handling. +- ``fs_attachment`` +- ``fs_storage`` These modules provide the necessary setup for file + storage and attachment handling. 2. **Configure File Storage** -- Navigate to **Settings** > **Technical** > **FS Storage**. -- Create or select an existing storage configuration. -- Ensure the storage is properly set up and tested for accessibility. +- Navigate to **Settings** > **Technical** > **FS Storage**. +- Create or select an existing storage configuration. +- Ensure the storage is properly set up and tested for accessibility. 3. **Link Backup File field to Storage** -- While configuring the file storage in **Settings** > **Technical** > - **FS Storage**, ensure that the ``backup_file`` from the - ``db.backup.fs.file`` model is listed under the ``Field`` field. -- This step is part of the storage configuration process. -- Save the changes after verifying the setup. +- While configuring the file storage in **Settings** > **Technical** > + **FS Storage**, ensure that the ``backup_file`` from the + ``db.backup.fs.file`` model is listed under the ``Field`` field. +- This step is part of the storage configuration process. +- Save the changes after verifying the setup. -|Example of File Storage Configuration| +.. image:: https://raw.githubusercontent.com/OCA/server-tools/16.0/auto_backup_fs_file/images/file_storage_configuration.png + :alt: Example of File Storage Configuration 4. **Verify Configuration** -- Perform a test backup to ensure the files are being stored in the - correct location. -- Check the logs for any errors or warnings. +- Perform a test backup to ensure the files are being stored in the + correct location. +- Check the logs for any errors or warnings. By following these steps, you will ensure that the module is properly configured for storing backups in the desired file storage system. -.. |Example of File Storage Configuration| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/images/file_storage_configuration.png - Usage ===== @@ -179,43 +178,43 @@ How to Use the Module 4. Manage Fs File Backups ~~~~~~~~~~~~~~~~~~~~~~~~~ -- In the Fs File backups list view, you can see details such as the - backup filename and associated database backup configuration. -- Use this view to manage or download backups as needed. +- In the Fs File backups list view, you can see details such as the + backup filename and associated database backup configuration. +- Use this view to manage or download backups as needed. Screenshots ~~~~~~~~~~~ -- **Backup Configuration Form View** |Backup Configuration Form| +- **Backup Configuration Form View** |Backup Configuration Form| -- **Fs File Backups List View** |Fs File Backups List| +- **Fs File Backups List View** |Fs File Backups List| Notes ~~~~~ -- Ensure that the FSSPEC storage is properly configured before using the - **Fs File** method. -- This module adds a new stat button in the backup configuration form - view to quickly access Fs File backups. +- Ensure that the FSSPEC storage is properly configured before using + the **Fs File** method. +- This module adds a new stat button in the backup configuration form + view to quickly access Fs File backups. -.. |Backup Configuration Form| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/static/description/db_backup_form_view.png -.. |Fs File Backups List| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png +.. |Backup Configuration Form| image:: https://raw.githubusercontent.com/OCA/server-tools/16.0/auto_backup_fs_file/static/description/db_backup_form_view.png +.. |Fs File Backups List| image:: https://raw.githubusercontent.com/OCA/server-tools/16.0/auto_backup_fs_file/static/description/db_backup_fs_file_tree_view.png Known issues / Roadmap ====================== -- **Folder field behavior**: The ``folder`` field on the ``db.backup`` - model specifies the backup storage directory. For records using the - ``fs_file`` method, storage is actually controlled by the ``fs_file`` - field's settings. However, since ``folder`` is currently a required - non-computed field in the ``auto_backup`` addon, modifications to sync - these two fields are not performed. Future versions may add this - synchronization support. +- **Folder field behavior**: The ``folder`` field on the ``db.backup`` + model specifies the backup storage directory. For records using the + ``fs_file`` method, storage is actually controlled by the ``fs_file`` + field's settings. However, since ``folder`` is currently a required + non-computed field in the ``auto_backup`` addon, modifications to + sync these two fields are not performed. Future versions may add this + synchronization support. -- **Design limitation**: The current implementation has a design - constraint due to ``fs_storage`` addon limitations. Since storage - setting targets the ``db.backup.fs.file`` model, only one storage - backend can effectively be used. +- **Design limitation**: The current implementation has a design + constraint due to ``fs_storage`` addon limitations. Since storage + setting targets the ``db.backup.fs.file`` model, only one storage + backend can effectively be used. Bug Tracker =========== @@ -223,7 +222,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. @@ -238,14 +237,14 @@ Authors Contributors ------------ -- Rolando Pérez Rebollo r.perez@binhex.cloud +- Rolando Pérez Rebollo r.perez@binhex.cloud Other credits ------------- The development of this module has been financially supported by: -- Binhex +- Binhex Maintainers ----------- @@ -260,6 +259,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/server-tools `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/auto_backup_fs_file/__manifest__.py b/auto_backup_fs_file/__manifest__.py index 7c8490c8c9b..3b6c2a56411 100644 --- a/auto_backup_fs_file/__manifest__.py +++ b/auto_backup_fs_file/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Auto Backup Fs File", "summary": """Store backups using some FSSPEC implementation""", - "version": "17.0.1.0.0", + "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Binhex,Odoo Community Association (OCA)", "category": "Tools", diff --git a/auto_backup_fs_file/static/description/index.html b/auto_backup_fs_file/static/description/index.html index 967556011f1..dc0df07e593 100644 --- a/auto_backup_fs_file/static/description/index.html +++ b/auto_backup_fs_file/static/description/index.html @@ -374,7 +374,7 @@

Auto Backup Fs File

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ee3d4c88955253f4037b88f12085fc335206fe54512032059d08dddf4c753c51 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Alpha License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

Alpha License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

This module enhances the database backup functionality in Odoo by introducing support for storing backups as files using the fsspec library. It is designed to address the need for reliable and flexible @@ -493,7 +493,7 @@

Configuration

  • This step is part of the storage configuration process.
  • Save the changes after verifying the setup.
  • -

    Example of File Storage Configuration

    +Example of File Storage Configuration
    1. Verify Configuration
    @@ -554,15 +554,15 @@

    4. Manage Fs File Backups

    Screenshots

      -
    • Backup Configuration Form View Backup Configuration Form
    • -
    • Fs File Backups List View Fs File Backups List
    • +
    • Backup Configuration Form View Backup Configuration Form
    • +
    • Fs File Backups List View Fs File Backups List

    Notes

      -
    • Ensure that the FSSPEC storage is properly configured before using the -Fs File method.
    • +
    • Ensure that the FSSPEC storage is properly configured before using +the Fs File method.
    • This module adds a new stat button in the backup configuration form view to quickly access Fs File backups.
    @@ -576,8 +576,8 @@

    Known issues / Roadmap

    model specifies the backup storage directory. For records using the fs_file method, storage is actually controlled by the fs_file field’s settings. However, since folder is currently a required -non-computed field in the auto_backup addon, modifications to sync -these two fields are not performed. Future versions may add this +non-computed field in the auto_backup addon, modifications to +sync these two fields are not performed. Future versions may add this synchronization support.
  • Design limitation: The current implementation has a design constraint due to fs_storage addon limitations. Since storage @@ -590,7 +590,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.

  • @@ -623,7 +623,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

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

    +

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

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

    diff --git a/auto_backup_fs_file/views/db_backup_views.xml b/auto_backup_fs_file/views/db_backup_views.xml index 1bbe336b90e..c5f3f33f3f2 100644 --- a/auto_backup_fs_file/views/db_backup_views.xml +++ b/auto_backup_fs_file/views/db_backup_views.xml @@ -12,7 +12,7 @@ + + + {'invisible': [('method', '=', 'fs_file')]} + - + From e1451df386eea9d8359129c3bb7b98004ba3d601 Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 21 Jul 2026 20:13:15 -0400 Subject: [PATCH 5/8] [IMP] auto_backup_fs_file: add @api.depends to is_expired; explicit unlink for GC --- .../models/db_backup_fs_file.py | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/auto_backup_fs_file/models/db_backup_fs_file.py b/auto_backup_fs_file/models/db_backup_fs_file.py index 4934b400845..d5f5fabfefa 100644 --- a/auto_backup_fs_file/models/db_backup_fs_file.py +++ b/auto_backup_fs_file/models/db_backup_fs_file.py @@ -22,6 +22,7 @@ class DbBackupFsFile(models.Model): help="Indicates whether the backup has exceeded its storage time.", ) + @api.depends("db_backup_id.days_to_keep", "create_date") def _compute_is_expired(self): """Compute whether the backup has exceeded its storage time.""" for record in self: @@ -34,6 +35,25 @@ def _compute_is_expired(self): else: record.is_expired = False + def unlink(self): + """Unlink backing ir.attachment records before deleting the DB record. + + Odoo's base Model.unlink() does cascade-delete ir.attachment via raw + SQL, but we make this explicit to ensure the fs_attachment GC stack + (_fs_mark_for_gc) is triggered reliably. The physical file on the + external storage is removed by the autovacuum GC job + (fs_file_gc._gc_files), not synchronously here. + """ + attachments = self.env["ir.attachment"].search( + [ + ("res_model", "=", self._name), + ("res_id", "in", self.ids), + ("res_field", "=", "backup_file"), + ] + ) + attachments.unlink() + return super().unlink() + @api.model def fs_storage(self): FsStorage = self.env["fs.storage"] @@ -51,7 +71,3 @@ def fs_storage(self): if fs_storage: return fs_storage return False - - def get_fs_storage_filename(self): - self.ensure_one() - return self.backup_file.attachment.store_fname.split("://")[-1] From 187a2e8198c91700f7e35f5520739c15a4893bbf Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 21 Jul 2026 20:15:18 -0400 Subject: [PATCH 6/8] [IMP] auto_backup_fs_file: delegate cleanup to GC; trigger cleanup from action_backup --- auto_backup_fs_file/models/db_backup.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/auto_backup_fs_file/models/db_backup.py b/auto_backup_fs_file/models/db_backup.py index 42d0ae6d339..f7290c04d95 100644 --- a/auto_backup_fs_file/models/db_backup.py +++ b/auto_backup_fs_file/models/db_backup.py @@ -74,6 +74,7 @@ def _check_fs_file_backup_storage(self): def action_backup(self): """Override the action_backup method to add the fs_file method.""" fs_backups = self.filtered(lambda it: it.method == "fs_file") + successful_fs = self.browse() dbname = self.env.cr.dbname for fs_backup in fs_backups: with fs_backup.backup_log(): @@ -114,7 +115,9 @@ def action_backup(self): summary=_("Database backup is ready to download."), user_id=user_to_notify.id, ) + successful_fs |= fs_backup res = super().action_backup() + successful_fs.cleanup() return res def action_open_fs_backups_view(self): @@ -126,14 +129,18 @@ def action_open_fs_backups_view(self): return action def cleanup(self): - """Extend cleanup to fs_file backups.""" + """Extend cleanup to fs_file backups. + + Physical file removal is handled by the fs_attachment GC stack: + unlink() on db.backup.fs.file cascades to ir.attachment.unlink(), + which marks the file in fs.file.gc for deferred deletion by the + autovacuum job. + """ for db_backup_conf in self.filtered( lambda record: record.method == "fs_file" and record.days_to_keep ): with db_backup_conf.cleanup_log(): to_delete = db_backup_conf.fs_file_backup_ids.filtered("is_expired") - for backup in to_delete: - self._get_fs_storage().fs.rm_file(backup.get_fs_storage_filename()) to_delete.unlink() res = super().cleanup() return res From 87390cbfeda241e91cd0319bead9160f5443c96a Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 21 Jul 2026 23:20:49 -0400 Subject: [PATCH 7/8] [IMP] auto_backup_fs_file: add regression test for action_backup cleanup trigger --- .../tests/test_auto_backup_fs_file.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/auto_backup_fs_file/tests/test_auto_backup_fs_file.py b/auto_backup_fs_file/tests/test_auto_backup_fs_file.py index d169e8e6132..29d7b82e43d 100644 --- a/auto_backup_fs_file/tests/test_auto_backup_fs_file.py +++ b/auto_backup_fs_file/tests/test_auto_backup_fs_file.py @@ -70,6 +70,7 @@ def test_ordinary_flow(self): backup_config.name, f"Fs File Backup - {backup_config._get_fs_storage().name}", ) + self.assertFalse(backup_config.folder) # Test computation of fs_file_backup_count self.assertEqual(backup_config.fs_file_backup_count, 0) @@ -121,3 +122,51 @@ def fake_now(): backup_config.cleanup() # Will use the computed is_expired self.assertEqual(backup_config.fs_file_backup_count, 0) + + # Verify the backing ir.attachment is also removed (GC chain fires via unlink) + attachment = self.env["ir.attachment"].search( + [ + ("res_model", "=", "db.backup.fs.file"), + ("res_field", "=", "backup_file"), + ] + ) + self.assertFalse(attachment) + + def test_action_backup_triggers_cleanup(self): + """cleanup() must fire for fs_file records via action_backup(), not just + when called directly. Regression test for the bug where action_backup() + only passed local/sftp records to successful.cleanup(), making fs_file + cleanup dead code in production.""" + self.test_storage.field_xmlids = ( + "auto_backup_fs_file.field_db_backup_fs_file__backup_file" + ) + backup_config = self._create_backup_config() + + # Run first backup — creates record at create_date = now + self._action_backup(backup_config) + self.assertEqual(backup_config.fs_file_backup_count, 1) + first_backup = backup_config.fs_file_backup_ids + + # Make the first backup expired by setting an old create_date directly + # (avoids patching Datetime.now which doesn't control ORM create_date) + old_date = fields.Datetime.add( + fields.Datetime.now(), days=-backup_config.days_to_keep - 1 + ) + self.env.cr.execute( + "UPDATE db_backup_fs_file SET create_date = %s WHERE id = %s", + (old_date, first_backup.id), + ) + first_backup.invalidate_recordset(["is_expired", "create_date"]) + self.assertTrue(first_backup.is_expired) + + # Run second backup via action_backup() — this is the PRODUCTION call path. + # cleanup() must be triggered automatically for the expired first backup. + self._action_backup(backup_config) + + # First backup must be gone (cleanup deleted it) + self.assertFalse( + first_backup.exists(), + "Expired backup was not deleted by action_backup()", + ) + # A new backup should have been created + self.assertTrue(backup_config.fs_file_backup_ids) From 8ce4fa59617dca3b8d27943c454a9f5c7fac5698 Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 21 Jul 2026 23:22:39 -0400 Subject: [PATCH 8/8] [IMP] auto_backup_fs_file: update docs for GC-based cleanup and folder visibility --- auto_backup_fs_file/README.rst | 46 +++++++++-- auto_backup_fs_file/readme/CONTEXT.md | 2 + auto_backup_fs_file/readme/INSTALL.md | 2 +- auto_backup_fs_file/readme/ROADMAP.md | 2 +- auto_backup_fs_file/readme/USAGE.md | 12 +++ .../static/description/index.html | 79 +++++++++++++------ 6 files changed, 111 insertions(+), 32 deletions(-) diff --git a/auto_backup_fs_file/README.rst b/auto_backup_fs_file/README.rst index 43d583eac20..855dd392262 100644 --- a/auto_backup_fs_file/README.rst +++ b/auto_backup_fs_file/README.rst @@ -87,6 +87,15 @@ exporting Odoo instance data and storing it in the specified filesystem. Additionally, it allows users to download the backups for local storage or further processing. +Backup file cleanup is handled automatically based on the **Days to +Keep** configuration. When expired backup records are removed, the +physical backup files are not deleted synchronously. Instead, the module +delegates file deletion to the ``fs_attachment`` garbage collector (GC), +which marks files for deferred removal and physically deletes them +during Odoo's autovacuum cron cycle. This two-phase approach ensures +transactional safety: files are only removed once the GC confirms no +database record still references them. + USEFUL INFORMATION: - **Dependencies**: This module depends on the ``fsspec`` library, its @@ -98,7 +107,7 @@ Installation ============ This addon itself does not introduce any dependencies, but its -dependencies may require additional packages.:wa +dependencies may require additional packages. Configuration ============= @@ -182,6 +191,31 @@ How to Use the Module backup filename and associated database backup configuration. - Use this view to manage or download backups as needed. +5. Cleanup and File Deletion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Backup retention is controlled by the **Days to Keep** field on the +backup configuration. When this value is greater than 0, the automatic +cleanup process removes expired backup records during each backup run. + +When a backup record is deleted (either by automatic cleanup or manually +from the list view), the physical backup file in the filesystem storage +is **not removed immediately**. Instead, the file is marked for deferred +deletion by the ``fs_attachment`` garbage collector (GC), which runs +periodically via Odoo's autovacuum cron. Physical files are only removed +from the storage backend once the GC confirms no database record +references them. + +This means: + +- **Immediately after deletion**: the database record is gone, but the + file may still exist in the storage backend for a short period. +- **After the next autovacuum cycle**: the file is permanently deleted + from the storage backend. + +This behavior requires the storage's ``autovacuum_gc`` flag to be +enabled (the default). If disabled, files must be managed manually. + Screenshots ~~~~~~~~~~~ @@ -205,11 +239,11 @@ Known issues / Roadmap - **Folder field behavior**: The ``folder`` field on the ``db.backup`` model specifies the backup storage directory. For records using the - ``fs_file`` method, storage is actually controlled by the ``fs_file`` - field's settings. However, since ``folder`` is currently a required - non-computed field in the ``auto_backup`` addon, modifications to - sync these two fields are not performed. Future versions may add this - synchronization support. + ``fs_file`` method, storage is controlled by the ``fs_file`` field's + settings. The ``folder`` field is hidden (``invisible``) and no + longer required when ``method='fs_file'``, so it no longer interferes + with ``fs_file`` configurations. No auto-sync between both fields is + performed since the methods are mutually exclusive. - **Design limitation**: The current implementation has a design constraint due to ``fs_storage`` addon limitations. Since storage diff --git a/auto_backup_fs_file/readme/CONTEXT.md b/auto_backup_fs_file/readme/CONTEXT.md index fe771bb0775..476024d83ee 100644 --- a/auto_backup_fs_file/readme/CONTEXT.md +++ b/auto_backup_fs_file/readme/CONTEXT.md @@ -9,5 +9,7 @@ Practical examples include: APPROACH: The module extends the backup functionality from the `auto_backup` module by introducing a method that allows storing the resulting backup using an `fsspec` implementation. This is achieved through the integration of the `fs_file` from [storage repository](https://github.com/OCA/storage). The module leverages the `fsspec` library to provide a flexible and extensible interface for interacting with various filesystems. It automates the backup process by exporting Odoo instance data and storing it in the specified filesystem. Additionally, it allows users to download the backups for local storage or further processing. + Backup file cleanup is handled automatically based on the **Days to Keep** configuration. When expired backup records are removed, the physical backup files are not deleted synchronously. Instead, the module delegates file deletion to the `fs_attachment` garbage collector (GC), which marks files for deferred removal and physically deletes them during Odoo's autovacuum cron cycle. This two-phase approach ensures transactional safety: files are only removed once the GC confirms no database record still references them. + USEFUL INFORMATION: - **Dependencies**: This module depends on the `fsspec` library, its relevant filesystem implementations, and the `fs_file` addon from OCA/storage. Ensure the required `fsspec` plugins are installed for your target filesystem. diff --git a/auto_backup_fs_file/readme/INSTALL.md b/auto_backup_fs_file/readme/INSTALL.md index f60d5acfaa5..bf5358ca486 100644 --- a/auto_backup_fs_file/readme/INSTALL.md +++ b/auto_backup_fs_file/readme/INSTALL.md @@ -1 +1 @@ -This addon itself does not introduce any dependencies, but its dependencies may require additional packages.:wa +This addon itself does not introduce any dependencies, but its dependencies may require additional packages. diff --git a/auto_backup_fs_file/readme/ROADMAP.md b/auto_backup_fs_file/readme/ROADMAP.md index a3a695bc2b8..26e6ecbd01a 100644 --- a/auto_backup_fs_file/readme/ROADMAP.md +++ b/auto_backup_fs_file/readme/ROADMAP.md @@ -1,3 +1,3 @@ -- **Folder field behavior**: The `folder` field on the `db.backup` model specifies the backup storage directory. For records using the `fs_file` method, storage is actually controlled by the `fs_file` field's settings. However, since `folder` is currently a required non-computed field in the `auto_backup` addon, modifications to sync these two fields are not performed. Future versions may add this synchronization support. +- **Folder field behavior**: The `folder` field on the `db.backup` model specifies the backup storage directory. For records using the `fs_file` method, storage is controlled by the `fs_file` field's settings. The `folder` field is hidden (`invisible`) and no longer required when `method='fs_file'`, so it no longer interferes with `fs_file` configurations. No auto-sync between both fields is performed since the methods are mutually exclusive. - **Design limitation**: The current implementation has a design constraint due to `fs_storage` addon limitations. Since storage setting targets the `db.backup.fs.file` model, only one storage backend can effectively be used. diff --git a/auto_backup_fs_file/readme/USAGE.md b/auto_backup_fs_file/readme/USAGE.md index b1b2cc0a190..0f2a7459c5e 100644 --- a/auto_backup_fs_file/readme/USAGE.md +++ b/auto_backup_fs_file/readme/USAGE.md @@ -23,6 +23,18 @@ This module extends the functionality of the database backup system in Odoo by i - In the Fs File backups list view, you can see details such as the backup filename and associated database backup configuration. - Use this view to manage or download backups as needed. +### 5. Cleanup and File Deletion + +Backup retention is controlled by the **Days to Keep** field on the backup configuration. When this value is greater than 0, the automatic cleanup process removes expired backup records during each backup run. + +When a backup record is deleted (either by automatic cleanup or manually from the list view), the physical backup file in the filesystem storage is **not removed immediately**. Instead, the file is marked for deferred deletion by the `fs_attachment` garbage collector (GC), which runs periodically via Odoo's autovacuum cron. Physical files are only removed from the storage backend once the GC confirms no database record references them. + +This means: +- **Immediately after deletion**: the database record is gone, but the file may still exist in the storage backend for a short period. +- **After the next autovacuum cycle**: the file is permanently deleted from the storage backend. + +This behavior requires the storage's `autovacuum_gc` flag to be enabled (the default). If disabled, files must be managed manually. + ### Screenshots - **Backup Configuration Form View** ![Backup Configuration Form](../static/description/db_backup_form_view.png) diff --git a/auto_backup_fs_file/static/description/index.html b/auto_backup_fs_file/static/description/index.html index dc0df07e593..9876acc30c1 100644 --- a/auto_backup_fs_file/static/description/index.html +++ b/auto_backup_fs_file/static/description/index.html @@ -405,19 +405,20 @@

    Auto Backup Fs File

  • 2. Perform a Backup
  • 3. View Fs File Backups
  • 4. Manage Fs File Backups
  • -
  • Screenshots
  • -
  • Notes
  • +
  • 5. Cleanup and File Deletion
  • +
  • Screenshots
  • +
  • Notes
  • -
  • Known issues / Roadmap
  • -
  • Bug Tracker
  • -
  • Credits @@ -450,6 +451,14 @@

    Use Cases / Context

    exporting Odoo instance data and storing it in the specified filesystem. Additionally, it allows users to download the backups for local storage or further processing.

    +

    Backup file cleanup is handled automatically based on the Days to +Keep configuration. When expired backup records are removed, the +physical backup files are not deleted synchronously. Instead, the module +delegates file deletion to the fs_attachment garbage collector (GC), +which marks files for deferred removal and physically deletes them +during Odoo’s autovacuum cron cycle. This two-phase approach ensures +transactional safety: files are only removed once the GC confirms no +database record still references them.

    USEFUL INFORMATION:

    • Dependencies: This module depends on the fsspec library, its @@ -461,7 +470,7 @@

      Use Cases / Context

      Installation

      This addon itself does not introduce any dependencies, but its -dependencies may require additional packages.:wa

      +dependencies may require additional packages.

      Configuration

      @@ -551,15 +560,37 @@

      4. Manage Fs File Backups

      Use this view to manage or download backups as needed.
    +
    +

    5. Cleanup and File Deletion

    +

    Backup retention is controlled by the Days to Keep field on the +backup configuration. When this value is greater than 0, the automatic +cleanup process removes expired backup records during each backup run.

    +

    When a backup record is deleted (either by automatic cleanup or manually +from the list view), the physical backup file in the filesystem storage +is not removed immediately. Instead, the file is marked for deferred +deletion by the fs_attachment garbage collector (GC), which runs +periodically via Odoo’s autovacuum cron. Physical files are only removed +from the storage backend once the GC confirms no database record +references them.

    +

    This means:

    +
      +
    • Immediately after deletion: the database record is gone, but the +file may still exist in the storage backend for a short period.
    • +
    • After the next autovacuum cycle: the file is permanently deleted +from the storage backend.
    • +
    +

    This behavior requires the storage’s autovacuum_gc flag to be +enabled (the default). If disabled, files must be managed manually.

    +
    -

    Screenshots

    +

    Screenshots

    • Backup Configuration Form View Backup Configuration Form
    • Fs File Backups List View Fs File Backups List
    -

    Notes

    +

    Notes

    • Ensure that the FSSPEC storage is properly configured before using the Fs File method.
    • @@ -570,15 +601,15 @@

      Notes

    -

    Known issues / Roadmap

    +

    Known issues / Roadmap

    • Folder field behavior: The folder field on the db.backup model specifies the backup storage directory. For records using the -fs_file method, storage is actually controlled by the fs_file -field’s settings. However, since folder is currently a required -non-computed field in the auto_backup addon, modifications to -sync these two fields are not performed. Future versions may add this -synchronization support.
    • +fs_file method, storage is controlled by the fs_file field’s +settings. The folder field is hidden (invisible) and no +longer required when method='fs_file', so it no longer interferes +with fs_file configurations. No auto-sync between both fields is +performed since the methods are mutually exclusive.
    • Design limitation: The current implementation has a design constraint due to fs_storage addon limitations. Since storage setting targets the db.backup.fs.file model, only one storage @@ -586,7 +617,7 @@

      Known issues / Roadmap

    -

    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 @@ -594,28 +625,28 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Binhex
    -

    Other credits

    +

    Other credits

    The development of this module has been financially supported by:

    • Binhex
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association