From f666e58d1cdf62e92491e6359a75cd1c728e575d Mon Sep 17 00:00:00 2001 From: Maksim Shurupov Date: Thu, 9 Jan 2025 20:44:29 +0300 Subject: [PATCH 01/14] [ADD] attachment_logging: Module added --- attachment_logging/README.rst | 100 ++++ attachment_logging/__init__.py | 2 + attachment_logging/__manifest__.py | 20 + attachment_logging/controllers/__init__.py | 1 + attachment_logging/controllers/main.py | 21 + .../data/mail_message_subtype_data.xml | 11 + attachment_logging/models/__init__.py | 2 + attachment_logging/models/ir_attachment.py | 92 ++++ .../models/res_config_settings.py | 10 + attachment_logging/readme/CONFIGURE.rst | 6 + attachment_logging/readme/CONTRIBUTORS.rst | 4 + attachment_logging/readme/DESCRIPTION.rst | 6 + attachment_logging/readme/USAGE.rst | 2 + .../static/description/index.html | 445 ++++++++++++++++++ .../attachment_card/attachment_card.xml | 13 + .../attachment_image/attachment_image.xml | 11 + .../static/src/img/settings.png | Bin 0 -> 118405 bytes .../static/src/models/attachment.esm.js | 24 + attachment_logging/tests/__init__.py | 1 + .../tests/test_ir_attachments.py | 204 ++++++++ .../views/res_config_settings_views.xml | 27 ++ 21 files changed, 1002 insertions(+) create mode 100644 attachment_logging/README.rst create mode 100644 attachment_logging/__init__.py create mode 100644 attachment_logging/__manifest__.py create mode 100644 attachment_logging/controllers/__init__.py create mode 100644 attachment_logging/controllers/main.py create mode 100644 attachment_logging/data/mail_message_subtype_data.xml create mode 100644 attachment_logging/models/__init__.py create mode 100644 attachment_logging/models/ir_attachment.py create mode 100644 attachment_logging/models/res_config_settings.py create mode 100644 attachment_logging/readme/CONFIGURE.rst create mode 100644 attachment_logging/readme/CONTRIBUTORS.rst create mode 100644 attachment_logging/readme/DESCRIPTION.rst create mode 100644 attachment_logging/readme/USAGE.rst create mode 100644 attachment_logging/static/description/index.html create mode 100644 attachment_logging/static/src/components/attachment_card/attachment_card.xml create mode 100644 attachment_logging/static/src/components/attachment_image/attachment_image.xml create mode 100644 attachment_logging/static/src/img/settings.png create mode 100644 attachment_logging/static/src/models/attachment.esm.js create mode 100644 attachment_logging/tests/__init__.py create mode 100644 attachment_logging/tests/test_ir_attachments.py create mode 100644 attachment_logging/views/res_config_settings_views.xml diff --git a/attachment_logging/README.rst b/attachment_logging/README.rst new file mode 100644 index 00000000000..69c8d38be28 --- /dev/null +++ b/attachment_logging/README.rst @@ -0,0 +1,100 @@ +================== +Attachment Logging +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:7521c926362a2aa9cf7e326ec6a1d689d7824a617c9076a364251d23d16ee51d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/16.0/attachment_logging + :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-16-0/server-tools-16-0-attachment_logging + :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=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module shows attachment information in chatter. Following data is displayed: + +- User, who has created the attachment +- Attachment creation date + +It also allows to log attachment related actions in the record chatter. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To enable note logging of attachment operations in record chatter: + +- Go to "Settings > General Settings" and scroll to the "Discuss" section. +- Activate the "Attachment Logging" checkbox. + +.. image:: https://raw.githubusercontent.com/OCA/server-tools/16.0/attachment_logging/static/src/img/settings.png + +Usage +===== + +Create date and user are displayed next to attachments in chatter. +When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings. + +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 +~~~~~~~ + +* Cetmix + +Contributors +~~~~~~~~~~~~ + +- Cetmix + + - Ivan Sokolov + - Maksim Shurupov + +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/attachment_logging/__init__.py b/attachment_logging/__init__.py new file mode 100644 index 00000000000..91c5580fed3 --- /dev/null +++ b/attachment_logging/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/attachment_logging/__manifest__.py b/attachment_logging/__manifest__.py new file mode 100644 index 00000000000..eb99967ccd6 --- /dev/null +++ b/attachment_logging/__manifest__.py @@ -0,0 +1,20 @@ +{ + "name": "Attachment Logging", + "version": "16.0.1.0.0", + "author": "Cetmix, Odoo Community Association (OCA)", + "summary": "Show attachment information in chatter", + "website": "https://github.com/OCA/server-tools", + "license": "AGPL-3", + "category": "Hidden/Tools", + "depends": ["mail"], + "data": [ + "data/mail_message_subtype_data.xml", + "views/res_config_settings_views.xml", + ], + "assets": { + "web.assets_backend": [ + "attachment_logging/static/src/models/*", + "attachment_logging/static/src/components/*/*", + ] + }, +} diff --git a/attachment_logging/controllers/__init__.py b/attachment_logging/controllers/__init__.py new file mode 100644 index 00000000000..12a7e529b67 --- /dev/null +++ b/attachment_logging/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/attachment_logging/controllers/main.py b/attachment_logging/controllers/main.py new file mode 100644 index 00000000000..d48241597c8 --- /dev/null +++ b/attachment_logging/controllers/main.py @@ -0,0 +1,21 @@ +from odoo.http import request + +from odoo.addons.mail.controllers.discuss import DiscussController + + +class AttachmentController(DiscussController): + def mail_attachment_upload( + self, ufile, thread_id, thread_model, is_pending=False, **kwargs + ): + response = super().mail_attachment_upload( + ufile, thread_id, thread_model, is_pending=is_pending, **kwargs + ) + attachment_id = response.json.get("id") + if not attachment_id: + return response + # Update attachment data + attachmentData = {**response.json} + attachment = request.env["ir.attachment"].sudo().browse(attachment_id).exists() + if attachment: + attachmentData.update(**attachment.get_additional_data()) + return request.make_json_response(attachmentData) diff --git a/attachment_logging/data/mail_message_subtype_data.xml b/attachment_logging/data/mail_message_subtype_data.xml new file mode 100644 index 00000000000..36b3ef688c4 --- /dev/null +++ b/attachment_logging/data/mail_message_subtype_data.xml @@ -0,0 +1,11 @@ + + + + + Attachments + + + + + + diff --git a/attachment_logging/models/__init__.py b/attachment_logging/models/__init__.py new file mode 100644 index 00000000000..075fb0e6284 --- /dev/null +++ b/attachment_logging/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_attachment +from . import res_config_settings diff --git a/attachment_logging/models/ir_attachment.py b/attachment_logging/models/ir_attachment.py new file mode 100644 index 00000000000..4754a141cd3 --- /dev/null +++ b/attachment_logging/models/ir_attachment.py @@ -0,0 +1,92 @@ +from odoo import _, api, models +from odoo.fields import Datetime + + +class IrAttachment(models.Model): + _inherit = "ir.attachment" + + def _send_attachment_notification(self, is_create=False, is_unlink=False): + """ + Send attachment notification + + :param is_create: send notification for create method + :param is_unlink: send notification for unlink method + """ + if is_create: + action = _("attached") + elif is_unlink: + action = _("unlinked") + else: + return + record = self.env[self.res_model].sudo().browse(self.res_id) + message_text = _( + "%(username)s %(action)s a file: %(filename)s", + username=self.create_uid.name, + filename=self.name, + action=action, + ) + message = record.message_post( + body=message_text, + author_id=self.env.ref("base.user_root").partner_id.id, + subtype_xmlid="attachment_logging.mt_attachment", + ) + self.env["bus.bus"]._sendone( + self.env.user.partner_id.id, + "mail.message/insert", + { + "id": message.id, + "body": message.body, + }, + ) + + @api.model + def _is_use_attachment_log(self): + """Check use attachment log""" + return ( + self.env["ir.config_parameter"] + .sudo() + .get_param("attachment_logging.use_attachment_log", False) + ) + + def _post_add_create(self): + result = super()._post_add_create() + if not self._is_use_attachment_log(): + return result + # Send notification after creation attachments + for attachment in self: + if self.pool and issubclass( + self.pool[attachment.res_model], self.pool["mail.thread"] + ): + attachment._send_attachment_notification(is_create=True) + return result + + def _delete_and_notify(self): + if not self._is_use_attachment_log(): + return super()._delete_and_notify() + # Send notification before unlink attachments + for attachment in self: + if self.pool and issubclass( + self.pool[attachment.res_model], self.pool["mail.thread"] + ): + attachment._send_attachment_notification(is_unlink=True) + return super()._delete_and_notify() + + def _attachment_format(self, legacy=False): + res_list = super()._attachment_format(legacy=legacy) + for res in res_list: + attachment = self.browse(res.get("id")) + res.update(**attachment.get_additional_data()) + return res_list + + def get_additional_data(self): + """Get additional data for attachment""" + self.ensure_one() + tz = self._context.get("tz") or self.env.user.tz + create_date = self.create_date + create_date = Datetime.context_timestamp( + self.with_context(tz=tz), timestamp=create_date + ) + return { + "create_date": Datetime.to_string(create_date), + "create_user": self.create_uid.name, + } diff --git a/attachment_logging/models/res_config_settings.py b/attachment_logging/models/res_config_settings.py new file mode 100644 index 00000000000..d553ebce731 --- /dev/null +++ b/attachment_logging/models/res_config_settings.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + use_attachment_log = fields.Boolean( + config_parameter="attachment_logging.use_attachment_log", + help="Log attachment operations in chatter", + ) diff --git a/attachment_logging/readme/CONFIGURE.rst b/attachment_logging/readme/CONFIGURE.rst new file mode 100644 index 00000000000..dda5faba5ef --- /dev/null +++ b/attachment_logging/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +To enable note logging of attachment operations in record chatter: + +- Go to "Settings > General Settings" and scroll to the "Discuss" section. +- Activate the "Attachment Logging" checkbox. + +.. image:: ../static/src/img/settings.png diff --git a/attachment_logging/readme/CONTRIBUTORS.rst b/attachment_logging/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..372c78adcf3 --- /dev/null +++ b/attachment_logging/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +- Cetmix + + - Ivan Sokolov + - Maksim Shurupov diff --git a/attachment_logging/readme/DESCRIPTION.rst b/attachment_logging/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..ed8455b18ae --- /dev/null +++ b/attachment_logging/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module shows attachment information in chatter. Following data is displayed: + +- User, who has created the attachment +- Attachment creation date + +It also allows to log attachment related actions in the record chatter. diff --git a/attachment_logging/readme/USAGE.rst b/attachment_logging/readme/USAGE.rst new file mode 100644 index 00000000000..83d942eb79a --- /dev/null +++ b/attachment_logging/readme/USAGE.rst @@ -0,0 +1,2 @@ +Create date and user are displayed next to attachments in chatter. +When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings. diff --git a/attachment_logging/static/description/index.html b/attachment_logging/static/description/index.html new file mode 100644 index 00000000000..69900b51429 --- /dev/null +++ b/attachment_logging/static/description/index.html @@ -0,0 +1,445 @@ + + + + + +Attachment Logging + + + +
+

Attachment Logging

+ + +

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

+

This module shows attachment information in chatter. Following data is displayed:

+
    +
  • User, who has created the attachment
  • +
  • Attachment creation date
  • +
+

It also allows to log attachment related actions in the record chatter.

+

Table of contents

+ +
+

Configuration

+

To enable note logging of attachment operations in record chatter:

+
    +
  • Go to “Settings > General Settings” and scroll to the “Discuss” section.
  • +
  • Activate the “Attachment Logging” checkbox.
  • +
+https://raw.githubusercontent.com/OCA/server-tools/16.0/attachment_logging/static/src/img/settings.png +
+
+

Usage

+

Create date and user are displayed next to attachments in chatter. +When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings.

+
+
+

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

+
    +
  • Cetmix
  • +
+
+
+

Contributors

+
    +
  • Cetmix <cetmix.com>
      +
    • Ivan Sokolov
    • +
    • Maksim Shurupov
    • +
    +
  • +
+
+
+

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/attachment_logging/static/src/components/attachment_card/attachment_card.xml b/attachment_logging/static/src/components/attachment_card/attachment_card.xml new file mode 100644 index 00000000000..fb9aa400e15 --- /dev/null +++ b/attachment_logging/static/src/components/attachment_card/attachment_card.xml @@ -0,0 +1,13 @@ + + + + + +
+
+ +
+
+
+ +
diff --git a/attachment_logging/static/src/components/attachment_image/attachment_image.xml b/attachment_logging/static/src/components/attachment_image/attachment_image.xml new file mode 100644 index 00000000000..f5916ddd0e1 --- /dev/null +++ b/attachment_logging/static/src/components/attachment_image/attachment_image.xml @@ -0,0 +1,11 @@ + + + + +
+
+ +
+
+ +
diff --git a/attachment_logging/static/src/img/settings.png b/attachment_logging/static/src/img/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e981d3f140556d0920cdb56fae0748babfca0f GIT binary patch literal 118405 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 literal 0 HcmV?d00001 diff --git a/attachment_logging/static/src/models/attachment.esm.js b/attachment_logging/static/src/models/attachment.esm.js new file mode 100644 index 00000000000..32a037d343e --- /dev/null +++ b/attachment_logging/static/src/models/attachment.esm.js @@ -0,0 +1,24 @@ +/** @odoo-module **/ + +import {attr} from "@mail/model/model_field"; +import {registerPatch} from "@mail/model/model_core"; + +registerPatch({ + name: "Attachment", + modelMethods: { + convertData(data) { + const data2 = this._super(data); + if ("create_date" in data) { + data2.create_date = data.create_date; + } + if ("create_user" in data) { + data2.create_user = data.create_user; + } + return data2; + }, + }, + fields: { + create_date: attr(), + create_user: attr(), + }, +}); diff --git a/attachment_logging/tests/__init__.py b/attachment_logging/tests/__init__.py new file mode 100644 index 00000000000..77aea02d82f --- /dev/null +++ b/attachment_logging/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ir_attachments diff --git a/attachment_logging/tests/test_ir_attachments.py b/attachment_logging/tests/test_ir_attachments.py new file mode 100644 index 00000000000..595dc141781 --- /dev/null +++ b/attachment_logging/tests/test_ir_attachments.py @@ -0,0 +1,204 @@ +import json +import tempfile + +from odoo.http import Request + +from odoo.addons.base.tests.common import HttpCaseWithUserDemo + + +class TestIrAttachments(HttpCaseWithUserDemo): + def _make_rpc(self, route, params, headers=None): + data = json.dumps( + { + "id": 0, + "jsonrpc": "2.0", + "method": "call", + "params": params, + } + ).encode() + headers = headers or {} + headers["Content-Type"] = "application/json" + return self.url_open(route, data, headers=headers) + + def setUp(self): + super().setUp() + self.partner = self.env["res.partner"].create({"name": "Test Partner #1"}) + self.mt_attachment = self.env.ref("attachment_logging.mt_attachment") + + def _attach_temp_file(self): + """Attach temp file to partner record""" + with tempfile.NamedTemporaryFile(mode="rb") as f: + response = self.url_open( + url=f"{self.base_url()}/mail/attachment/upload", + data={ + "thread_id": self.partner.id, + "thread_model": "res.partner", + "csrf_token": Request.csrf_token(self), + }, + files={"ufile": f}, + ) + return response + + def _delete_attachment(self, attachment_id): + """Delete attachment from partner record""" + response = self._make_rpc( + f"{self.base_url()}/mail/attachment/delete", + { + "attachment_id": attachment_id, + }, + ) + return response + + def test_upload_file_without_config(self): + """Test flow where upload temp file to record (default behavior)""" + self.authenticate("demo", "demo") + message_count = len(self.partner.message_ids) + response = self._attach_temp_file() + data = response.json() + self.assertEqual( + response.status_code, 200, "Response status code must be equal to 200 (OK)" + ) + attachments = self.env["ir.attachment"].search( + [ + ("res_id", "=", self.partner.id), + ("res_model", "=", "res.partner"), + ] + ) + self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") + self.assertEqual( + data.get("id"), attachments.id, "Attachment ID must be the same" + ) + self.assertNotIn( + "create_user", data, "'create_user' field is not contained in the data" + ) + self.assertNotIn( + "create_date", data, "'create_date' field is not contained in the data" + ) + self.assertEqual( + len(self.partner.message_ids), + message_count, + "Message count must be the same", + ) + + def test_upload_file_with_config(self): + """Test flow where upload temp file to record with log message""" + self.authenticate("demo", "demo") + message_count = len(self.partner.message_ids) + self.env["ir.config_parameter"].sudo().set_param( + "attachment_logging.use_attachment_log", True + ) + response = self._attach_temp_file() + data = response.json() + self.assertEqual( + response.status_code, 200, "Response status code must be equal to 200 (OK)" + ) + attachments = self.env["ir.attachment"].search( + [ + ("res_id", "=", self.partner.id), + ("res_model", "=", "res.partner"), + ] + ) + self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") + self.assertEqual( + data.get("id"), attachments.id, "Attachment ID must be the same" + ) + attachment_addition_data = attachments.get_additional_data() + self.assertEqual( + data.get("create_user"), + attachment_addition_data.get("create_user"), + "Attachment authors must be the same", + ) + self.assertEqual( + data.get("create_date"), + attachment_addition_data.get("create_date"), + "Dates must be the same", + ) + self.assertNotEqual( + len(self.partner.message_ids), + message_count, + "Message count must not be the same", + ) + last_message = self.partner.message_ids[0] + self.assertEqual( + last_message.subtype_id, + self.mt_attachment, + "Message subtypes must be the same", + ) + self.assertEqual( + last_message.author_id, + self.env.ref("base.user_root").partner_id, + "Message author must be OdooBot", + ) + self.assertIn( + "attached", last_message.body, "Message body must be contain 'attached'" + ) + + def test_delete_attachment_without_config(self): + """Test flow where delete attachment from record (default behavior)""" + self.authenticate("demo", "demo") + message_count = len(self.partner.message_ids) + response = self._attach_temp_file() + data = response.json() + attachments = self.env["ir.attachment"].search( + [ + ("res_id", "=", self.partner.id), + ("res_model", "=", "res.partner"), + ] + ) + self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") + self.assertEqual( + response.status_code, 200, "Response status code must be equal to 200 (OK)" + ) + self._delete_attachment(attachment_id=data["id"]) + attachments = self.env["ir.attachment"].search( + [ + ("res_id", "=", self.partner.id), + ("res_model", "=", "res.partner"), + ] + ) + self.assertFalse(attachments, "Attachments must be empty") + self.assertEqual( + len(self.partner.message_ids), + message_count, + "Message count must be the same", + ) + + def test_delete_attachment_with_config(self): + """Test flow where delete attachment from record with log message""" + self.authenticate("demo", "demo") + message_count = len(self.partner.message_ids) + self.env["ir.config_parameter"].sudo().set_param( + "attachment_logging.use_attachment_log", True + ) + response = self._attach_temp_file() + data = response.json() + self.assertEqual( + response.status_code, 200, "Response status code must be equal to 200 (OK)" + ) + self._delete_attachment(attachment_id=data["id"]) + attachments = self.env["ir.attachment"].search( + [ + ("res_id", "=", self.partner.id), + ("res_model", "=", "res.partner"), + ] + ) + self.assertFalse(attachments, "Attachments must be empty") + self.assertNotEqual( + len(self.partner.message_ids), + message_count, + "Message count must not be the same", + ) + last_message = self.partner.message_ids[0] + self.assertEqual( + last_message.subtype_id, + self.mt_attachment, + "Message subtypes must be the same", + ) + self.assertEqual( + last_message.author_id, + self.env.ref("base.user_root").partner_id, + "Message author must be OdooBot", + ) + self.assertIn( + "unlinked", last_message.body, "Message body must be contain 'unlinked'" + ) diff --git a/attachment_logging/views/res_config_settings_views.xml b/attachment_logging/views/res_config_settings_views.xml new file mode 100644 index 00000000000..fa9155907ac --- /dev/null +++ b/attachment_logging/views/res_config_settings_views.xml @@ -0,0 +1,27 @@ + + + + + res.config.settings.form.view.inherited.attachment_logging + res.config.settings + + +

+
+
+ +
+
+ Attachment Logging +
+ Log a note in record chatter when an attachment is added or removed. +
+
+
+
+ + + + From 590c4921812b1570bccd2736ddf9e3da9946511d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adasat=20Torres=20de=20Le=C3=B3n?= Date: Wed, 11 Jun 2025 09:56:28 +0100 Subject: [PATCH 02/14] [IMP] attachment_logging: pre-commit auto fixes --- attachment_logging/README.rst | 31 +++++++++++-------- attachment_logging/pyproject.toml | 3 ++ attachment_logging/readme/CONFIGURE.md | 7 +++++ attachment_logging/readme/CONFIGURE.rst | 6 ---- .../{CONTRIBUTORS.rst => CONTRIBUTORS.md} | 3 +- .../{DESCRIPTION.rst => DESCRIPTION.md} | 3 +- attachment_logging/readme/USAGE.md | 3 ++ attachment_logging/readme/USAGE.rst | 2 -- .../static/description/index.html | 30 +++++++++++------- 9 files changed, 52 insertions(+), 36 deletions(-) create mode 100644 attachment_logging/pyproject.toml create mode 100644 attachment_logging/readme/CONFIGURE.md delete mode 100644 attachment_logging/readme/CONFIGURE.rst rename attachment_logging/readme/{CONTRIBUTORS.rst => CONTRIBUTORS.md} (60%) rename attachment_logging/readme/{DESCRIPTION.rst => DESCRIPTION.md} (91%) create mode 100644 attachment_logging/readme/USAGE.md delete mode 100644 attachment_logging/readme/USAGE.rst diff --git a/attachment_logging/README.rst b/attachment_logging/README.rst index 69c8d38be28..805e084ff9f 100644 --- a/attachment_logging/README.rst +++ b/attachment_logging/README.rst @@ -17,18 +17,19 @@ Attachment Logging :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/16.0/attachment_logging + :target: https://github.com/OCA/server-tools/tree/17.0/attachment_logging :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-16-0/server-tools-16-0-attachment_logging + :target: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-attachment_logging :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=16.0 + :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 shows attachment information in chatter. Following data is displayed: +This module shows attachment information in chatter. Following data is +displayed: - User, who has created the attachment - Attachment creation date @@ -45,16 +46,20 @@ Configuration To enable note logging of attachment operations in record chatter: -- Go to "Settings > General Settings" and scroll to the "Discuss" section. +- Go to "Settings > General Settings" and scroll to the "Discuss" + section. - Activate the "Attachment Logging" checkbox. -.. image:: https://raw.githubusercontent.com/OCA/server-tools/16.0/attachment_logging/static/src/img/settings.png +|image| + +.. |image| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/attachment_logging/static/src/img/settings.png Usage ===== -Create date and user are displayed next to attachments in chatter. -When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings. +Create date and user are displayed next to attachments in chatter. When +attachment is added or removed a note is logged in chatter if the +corresponding option is enabled in the General Settings. Bug Tracker =========== @@ -62,7 +67,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. @@ -70,12 +75,12 @@ Credits ======= Authors -~~~~~~~ +------- * Cetmix Contributors -~~~~~~~~~~~~ +------------ - Cetmix @@ -83,7 +88,7 @@ Contributors - Maksim Shurupov Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -95,6 +100,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/attachment_logging/pyproject.toml b/attachment_logging/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/attachment_logging/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/attachment_logging/readme/CONFIGURE.md b/attachment_logging/readme/CONFIGURE.md new file mode 100644 index 00000000000..7344c19d05b --- /dev/null +++ b/attachment_logging/readme/CONFIGURE.md @@ -0,0 +1,7 @@ +To enable note logging of attachment operations in record chatter: + +- Go to "Settings \> General Settings" and scroll to the "Discuss" + section. +- Activate the "Attachment Logging" checkbox. + +![image](../static/src/img/settings.png) diff --git a/attachment_logging/readme/CONFIGURE.rst b/attachment_logging/readme/CONFIGURE.rst deleted file mode 100644 index dda5faba5ef..00000000000 --- a/attachment_logging/readme/CONFIGURE.rst +++ /dev/null @@ -1,6 +0,0 @@ -To enable note logging of attachment operations in record chatter: - -- Go to "Settings > General Settings" and scroll to the "Discuss" section. -- Activate the "Attachment Logging" checkbox. - -.. image:: ../static/src/img/settings.png diff --git a/attachment_logging/readme/CONTRIBUTORS.rst b/attachment_logging/readme/CONTRIBUTORS.md similarity index 60% rename from attachment_logging/readme/CONTRIBUTORS.rst rename to attachment_logging/readme/CONTRIBUTORS.md index 372c78adcf3..3734eba5774 100644 --- a/attachment_logging/readme/CONTRIBUTORS.rst +++ b/attachment_logging/readme/CONTRIBUTORS.md @@ -1,4 +1,3 @@ -- Cetmix - +- Cetmix \ - Ivan Sokolov - Maksim Shurupov diff --git a/attachment_logging/readme/DESCRIPTION.rst b/attachment_logging/readme/DESCRIPTION.md similarity index 91% rename from attachment_logging/readme/DESCRIPTION.rst rename to attachment_logging/readme/DESCRIPTION.md index ed8455b18ae..8a61fbe31d7 100644 --- a/attachment_logging/readme/DESCRIPTION.rst +++ b/attachment_logging/readme/DESCRIPTION.md @@ -1,4 +1,5 @@ -This module shows attachment information in chatter. Following data is displayed: +This module shows attachment information in chatter. Following data is +displayed: - User, who has created the attachment - Attachment creation date diff --git a/attachment_logging/readme/USAGE.md b/attachment_logging/readme/USAGE.md new file mode 100644 index 00000000000..46f1aaa842c --- /dev/null +++ b/attachment_logging/readme/USAGE.md @@ -0,0 +1,3 @@ +Create date and user are displayed next to attachments in chatter. When +attachment is added or removed a note is logged in chatter if the +corresponding option is enabled in the General Settings. diff --git a/attachment_logging/readme/USAGE.rst b/attachment_logging/readme/USAGE.rst deleted file mode 100644 index 83d942eb79a..00000000000 --- a/attachment_logging/readme/USAGE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Create date and user are displayed next to attachments in chatter. -When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings. diff --git a/attachment_logging/static/description/index.html b/attachment_logging/static/description/index.html index 69900b51429..ef15059ae79 100644 --- a/attachment_logging/static/description/index.html +++ b/attachment_logging/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,8 +369,9 @@

Attachment Logging

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:7521c926362a2aa9cf7e326ec6a1d689d7824a617c9076a364251d23d16ee51d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -
-

This module shows attachment information in chatter. Following data is displayed:

+

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

+

This module shows attachment information in chatter. Following data is +displayed:

  • User, who has created the attachment
  • Attachment creation date
  • @@ -393,22 +395,24 @@

    Attachment Logging

    Configuration

    To enable note logging of attachment operations in record chatter:

      -
    • Go to “Settings > General Settings” and scroll to the “Discuss” section.
    • +
    • Go to “Settings > General Settings” and scroll to the “Discuss” +section.
    • Activate the “Attachment Logging” checkbox.
    -https://raw.githubusercontent.com/OCA/server-tools/16.0/attachment_logging/static/src/img/settings.png +

    image

    Usage

    -

    Create date and user are displayed next to attachments in chatter. -When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings.

    +

    Create date and user are displayed next to attachments in chatter. When +attachment is added or removed a note is logged in chatter if the +corresponding option is enabled in the General Settings.

    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.

    @@ -432,11 +436,13 @@

    Contributors

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +Odoo Community Association +

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

    -

    This module is part of the OCA/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.

    From be977a1b0a76e2c8c9831d8f6b6483a666c8002b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adasat=20Torres=20de=20Le=C3=B3n?= Date: Thu, 12 Jun 2025 09:54:43 +0100 Subject: [PATCH 03/14] [MIG]attachment_logging: Migration to 17.0 --- attachment_logging/README.rst | 4 + attachment_logging/__init__.py | 1 - attachment_logging/__manifest__.py | 5 +- attachment_logging/controllers/__init__.py | 1 - attachment_logging/controllers/main.py | 21 -- attachment_logging/models/ir_attachment.py | 84 +++--- attachment_logging/readme/CONTRIBUTORS.md | 3 + .../static/description/index.html | 4 + .../attachment_card/attachment_card.xml | 13 - .../attachment_image/attachment_image.xml | 11 - .../src/core/common/attachment_list.xml | 41 +++ .../static/src/models/attachment.esm.js | 24 -- .../tests/test_ir_attachments.py | 244 +++++------------- .../views/res_config_settings_views.xml | 24 +- 14 files changed, 157 insertions(+), 323 deletions(-) delete mode 100644 attachment_logging/controllers/__init__.py delete mode 100644 attachment_logging/controllers/main.py delete mode 100644 attachment_logging/static/src/components/attachment_card/attachment_card.xml delete mode 100644 attachment_logging/static/src/components/attachment_image/attachment_image.xml create mode 100644 attachment_logging/static/src/core/common/attachment_list.xml delete mode 100644 attachment_logging/static/src/models/attachment.esm.js diff --git a/attachment_logging/README.rst b/attachment_logging/README.rst index 805e084ff9f..9041ebd212d 100644 --- a/attachment_logging/README.rst +++ b/attachment_logging/README.rst @@ -87,6 +87,10 @@ Contributors - Ivan Sokolov - Maksim Shurupov +- Binhex <`www.binhex.com\\> >`__ + + - Adasat Torres de León a.torres@binhex.cloud + Maintainers ----------- diff --git a/attachment_logging/__init__.py b/attachment_logging/__init__.py index 91c5580fed3..0650744f6bc 100644 --- a/attachment_logging/__init__.py +++ b/attachment_logging/__init__.py @@ -1,2 +1 @@ -from . import controllers from . import models diff --git a/attachment_logging/__manifest__.py b/attachment_logging/__manifest__.py index eb99967ccd6..a4f4874b286 100644 --- a/attachment_logging/__manifest__.py +++ b/attachment_logging/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Attachment Logging", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "author": "Cetmix, Odoo Community Association (OCA)", "summary": "Show attachment information in chatter", "website": "https://github.com/OCA/server-tools", @@ -13,8 +13,7 @@ ], "assets": { "web.assets_backend": [ - "attachment_logging/static/src/models/*", - "attachment_logging/static/src/components/*/*", + "attachment_logging/static/src/**/*", ] }, } diff --git a/attachment_logging/controllers/__init__.py b/attachment_logging/controllers/__init__.py deleted file mode 100644 index 12a7e529b67..00000000000 --- a/attachment_logging/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import main diff --git a/attachment_logging/controllers/main.py b/attachment_logging/controllers/main.py deleted file mode 100644 index d48241597c8..00000000000 --- a/attachment_logging/controllers/main.py +++ /dev/null @@ -1,21 +0,0 @@ -from odoo.http import request - -from odoo.addons.mail.controllers.discuss import DiscussController - - -class AttachmentController(DiscussController): - def mail_attachment_upload( - self, ufile, thread_id, thread_model, is_pending=False, **kwargs - ): - response = super().mail_attachment_upload( - ufile, thread_id, thread_model, is_pending=is_pending, **kwargs - ) - attachment_id = response.json.get("id") - if not attachment_id: - return response - # Update attachment data - attachmentData = {**response.json} - attachment = request.env["ir.attachment"].sudo().browse(attachment_id).exists() - if attachment: - attachmentData.update(**attachment.get_additional_data()) - return request.make_json_response(attachmentData) diff --git a/attachment_logging/models/ir_attachment.py b/attachment_logging/models/ir_attachment.py index 4754a141cd3..4388f9a82f0 100644 --- a/attachment_logging/models/ir_attachment.py +++ b/attachment_logging/models/ir_attachment.py @@ -1,5 +1,5 @@ from odoo import _, api, models -from odoo.fields import Datetime +from odoo.tools.misc import format_datetime class IrAttachment(models.Model): @@ -20,24 +20,17 @@ def _send_attachment_notification(self, is_create=False, is_unlink=False): return record = self.env[self.res_model].sudo().browse(self.res_id) message_text = _( - "%(username)s %(action)s a file: %(filename)s", + "%(username)s %(action)s a file: %(filename)s", username=self.create_uid.name, filename=self.name, action=action, ) - message = record.message_post( + record.message_post( body=message_text, + message_type="notification", author_id=self.env.ref("base.user_root").partner_id.id, subtype_xmlid="attachment_logging.mt_attachment", ) - self.env["bus.bus"]._sendone( - self.env.user.partner_id.id, - "mail.message/insert", - { - "id": message.id, - "body": message.body, - }, - ) @api.model def _is_use_attachment_log(self): @@ -48,45 +41,36 @@ def _is_use_attachment_log(self): .get_param("attachment_logging.use_attachment_log", False) ) - def _post_add_create(self): - result = super()._post_add_create() - if not self._is_use_attachment_log(): - return result - # Send notification after creation attachments - for attachment in self: - if self.pool and issubclass( - self.pool[attachment.res_model], self.pool["mail.thread"] - ): - attachment._send_attachment_notification(is_create=True) + def _post_add_create(self, **kwargs): + result = super()._post_add_create(**kwargs) + if self._is_use_attachment_log(): + # Send notification after creation attachments + for attachment in self: + if self.pool and issubclass( + self.pool[attachment.res_model], self.pool["mail.thread"] + ): + attachment._send_attachment_notification(is_create=True) return result - def _delete_and_notify(self): - if not self._is_use_attachment_log(): - return super()._delete_and_notify() - # Send notification before unlink attachments - for attachment in self: - if self.pool and issubclass( - self.pool[attachment.res_model], self.pool["mail.thread"] - ): - attachment._send_attachment_notification(is_unlink=True) - return super()._delete_and_notify() - - def _attachment_format(self, legacy=False): - res_list = super()._attachment_format(legacy=legacy) - for res in res_list: - attachment = self.browse(res.get("id")) - res.update(**attachment.get_additional_data()) - return res_list + def _delete_and_notify(self, message=None): + if self._is_use_attachment_log(): + for attachment in self: + if self.pool and issubclass( + self.pool[attachment.res_model], self.pool["mail.thread"] + ): + attachment._send_attachment_notification(is_unlink=True) + return super()._delete_and_notify(message) - def get_additional_data(self): - """Get additional data for attachment""" - self.ensure_one() - tz = self._context.get("tz") or self.env.user.tz - create_date = self.create_date - create_date = Datetime.context_timestamp( - self.with_context(tz=tz), timestamp=create_date - ) - return { - "create_date": Datetime.to_string(create_date), - "create_user": self.create_uid.name, - } + def _attachment_format(self): + attachment_vals = super()._attachment_format() + for attachment_val in attachment_vals: + attachment = self.browse(attachment_val["id"]) + attachment_val.update( + { + "create_user": attachment.create_uid.name, + "create_date": format_datetime( + self.env, attachment_val["create_date"] + ), + } + ) + return attachment_vals diff --git a/attachment_logging/readme/CONTRIBUTORS.md b/attachment_logging/readme/CONTRIBUTORS.md index 3734eba5774..c55f2162889 100644 --- a/attachment_logging/readme/CONTRIBUTORS.md +++ b/attachment_logging/readme/CONTRIBUTORS.md @@ -1,3 +1,6 @@ - Cetmix \ - Ivan Sokolov - Maksim Shurupov +- Binhex \ + - Adasat Torres de León + diff --git a/attachment_logging/static/description/index.html b/attachment_logging/static/description/index.html index ef15059ae79..8a5b9d756a6 100644 --- a/attachment_logging/static/description/index.html +++ b/attachment_logging/static/description/index.html @@ -431,6 +431,10 @@

    Contributors

  • Maksim Shurupov
+
  • Binhex <www.binhex.com\> +
  • diff --git a/attachment_logging/static/src/components/attachment_card/attachment_card.xml b/attachment_logging/static/src/components/attachment_card/attachment_card.xml deleted file mode 100644 index fb9aa400e15..00000000000 --- a/attachment_logging/static/src/components/attachment_card/attachment_card.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -
    -
    - -
    -
    -
    - -
    diff --git a/attachment_logging/static/src/components/attachment_image/attachment_image.xml b/attachment_logging/static/src/components/attachment_image/attachment_image.xml deleted file mode 100644 index f5916ddd0e1..00000000000 --- a/attachment_logging/static/src/components/attachment_image/attachment_image.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - -
    -
    - -
    -
    - -
    diff --git a/attachment_logging/static/src/core/common/attachment_list.xml b/attachment_logging/static/src/core/common/attachment_list.xml new file mode 100644 index 00000000000..8a751849ebe --- /dev/null +++ b/attachment_logging/static/src/core/common/attachment_list.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + +
    + + +
    +
    +
    +
    diff --git a/attachment_logging/static/src/models/attachment.esm.js b/attachment_logging/static/src/models/attachment.esm.js deleted file mode 100644 index 32a037d343e..00000000000 --- a/attachment_logging/static/src/models/attachment.esm.js +++ /dev/null @@ -1,24 +0,0 @@ -/** @odoo-module **/ - -import {attr} from "@mail/model/model_field"; -import {registerPatch} from "@mail/model/model_core"; - -registerPatch({ - name: "Attachment", - modelMethods: { - convertData(data) { - const data2 = this._super(data); - if ("create_date" in data) { - data2.create_date = data.create_date; - } - if ("create_user" in data) { - data2.create_user = data.create_user; - } - return data2; - }, - }, - fields: { - create_date: attr(), - create_user: attr(), - }, -}); diff --git a/attachment_logging/tests/test_ir_attachments.py b/attachment_logging/tests/test_ir_attachments.py index 595dc141781..00352518376 100644 --- a/attachment_logging/tests/test_ir_attachments.py +++ b/attachment_logging/tests/test_ir_attachments.py @@ -1,204 +1,80 @@ -import json -import tempfile +import base64 +import logging -from odoo.http import Request +from odoo.tests import tagged +from odoo.tools.misc import format_datetime -from odoo.addons.base.tests.common import HttpCaseWithUserDemo +from odoo.addons.base.tests.common import TransactionCase +_logger = logging.getLogger(__name__) -class TestIrAttachments(HttpCaseWithUserDemo): - def _make_rpc(self, route, params, headers=None): - data = json.dumps( - { - "id": 0, - "jsonrpc": "2.0", - "method": "call", - "params": params, - } - ).encode() - headers = headers or {} - headers["Content-Type"] = "application/json" - return self.url_open(route, data, headers=headers) - - def setUp(self): - super().setUp() - self.partner = self.env["res.partner"].create({"name": "Test Partner #1"}) - self.mt_attachment = self.env.ref("attachment_logging.mt_attachment") - def _attach_temp_file(self): - """Attach temp file to partner record""" - with tempfile.NamedTemporaryFile(mode="rb") as f: - response = self.url_open( - url=f"{self.base_url()}/mail/attachment/upload", - data={ - "thread_id": self.partner.id, - "thread_model": "res.partner", - "csrf_token": Request.csrf_token(self), - }, - files={"ufile": f}, - ) - return response +@tagged("-at_install", "post_install") +class TestIrAttachments(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env["res.partner"].create({"name": "Test Partner #1"}) - def _delete_attachment(self, attachment_id): - """Delete attachment from partner record""" - response = self._make_rpc( - f"{self.base_url()}/mail/attachment/delete", + @classmethod + def _create_attachment(cls): + file_content = "Hi, this files is for tests." + file_data = base64.b64encode(file_content.encode("utf-8")) + return cls.env["ir.attachment"].create( { - "attachment_id": attachment_id, - }, + "name": "tst_file.txt", + "datas": file_data, + "res_model": cls.partner._name, + "res_id": cls.partner.id, + "mimetype": "text/plain", + } ) - return response - def test_upload_file_without_config(self): - """Test flow where upload temp file to record (default behavior)""" - self.authenticate("demo", "demo") - message_count = len(self.partner.message_ids) - response = self._attach_temp_file() - data = response.json() - self.assertEqual( - response.status_code, 200, "Response status code must be equal to 200 (OK)" - ) - attachments = self.env["ir.attachment"].search( - [ - ("res_id", "=", self.partner.id), - ("res_model", "=", "res.partner"), - ] - ) - self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") - self.assertEqual( - data.get("id"), attachments.id, "Attachment ID must be the same" - ) - self.assertNotIn( - "create_user", data, "'create_user' field is not contained in the data" - ) - self.assertNotIn( - "create_date", data, "'create_date' field is not contained in the data" - ) + def test01_attachment_format(self): + attachment = self._create_attachment() + result = attachment._attachment_format() + self.assertTrue(result) + self.assertEqual(result[0]["create_user"], attachment.create_uid.name) self.assertEqual( - len(self.partner.message_ids), - message_count, - "Message count must be the same", + result[0]["create_date"], + format_datetime(self.env, attachment.create_date), ) - def test_upload_file_with_config(self): - """Test flow where upload temp file to record with log message""" - self.authenticate("demo", "demo") - message_count = len(self.partner.message_ids) + def test02_post_add_create(self): + attachment = self._create_attachment() self.env["ir.config_parameter"].sudo().set_param( - "attachment_logging.use_attachment_log", True - ) - response = self._attach_temp_file() - data = response.json() - self.assertEqual( - response.status_code, 200, "Response status code must be equal to 200 (OK)" - ) - attachments = self.env["ir.attachment"].search( - [ - ("res_id", "=", self.partner.id), - ("res_model", "=", "res.partner"), - ] - ) - self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") - self.assertEqual( - data.get("id"), attachments.id, "Attachment ID must be the same" + "attachment_logging.use_attachment_log", False ) - attachment_addition_data = attachments.get_additional_data() - self.assertEqual( - data.get("create_user"), - attachment_addition_data.get("create_user"), - "Attachment authors must be the same", - ) - self.assertEqual( - data.get("create_date"), - attachment_addition_data.get("create_date"), - "Dates must be the same", - ) - self.assertNotEqual( - len(self.partner.message_ids), - message_count, - "Message count must not be the same", - ) - last_message = self.partner.message_ids[0] - self.assertEqual( - last_message.subtype_id, - self.mt_attachment, - "Message subtypes must be the same", - ) - self.assertEqual( - last_message.author_id, - self.env.ref("base.user_root").partner_id, - "Message author must be OdooBot", - ) - self.assertIn( - "attached", last_message.body, "Message body must be contain 'attached'" + self.partner.message_ids = [ + ( + 5, + 0, + ) + ] + attachment._post_add_create() + self.assertEqual(len(self.partner.message_ids), 0) + self.env["ir.config_parameter"].sudo().set_param( + "attachment_logging.use_attachment_log", True ) + attachment._post_add_create() + self.assertEqual(len(self.partner.message_ids), 1) - def test_delete_attachment_without_config(self): - """Test flow where delete attachment from record (default behavior)""" - self.authenticate("demo", "demo") - message_count = len(self.partner.message_ids) - response = self._attach_temp_file() - data = response.json() - attachments = self.env["ir.attachment"].search( - [ - ("res_id", "=", self.partner.id), - ("res_model", "=", "res.partner"), - ] - ) - self.assertEqual(len(attachments), 1, "Count attachment must be equal to 1") - self.assertEqual( - response.status_code, 200, "Response status code must be equal to 200 (OK)" - ) - self._delete_attachment(attachment_id=data["id"]) - attachments = self.env["ir.attachment"].search( - [ - ("res_id", "=", self.partner.id), - ("res_model", "=", "res.partner"), - ] - ) - self.assertFalse(attachments, "Attachments must be empty") - self.assertEqual( - len(self.partner.message_ids), - message_count, - "Message count must be the same", + def test03_delete_and_notify(self): + self.env["ir.config_parameter"].sudo().set_param( + "attachment_logging.use_attachment_log", False ) - - def test_delete_attachment_with_config(self): - """Test flow where delete attachment from record with log message""" - self.authenticate("demo", "demo") - message_count = len(self.partner.message_ids) + self.partner.message_ids = [ + ( + 5, + 0, + ) + ] + attachment = self._create_attachment() + attachment._delete_and_notify() + self.assertEqual(len(self.partner.message_ids), 0) self.env["ir.config_parameter"].sudo().set_param( "attachment_logging.use_attachment_log", True ) - response = self._attach_temp_file() - data = response.json() - self.assertEqual( - response.status_code, 200, "Response status code must be equal to 200 (OK)" - ) - self._delete_attachment(attachment_id=data["id"]) - attachments = self.env["ir.attachment"].search( - [ - ("res_id", "=", self.partner.id), - ("res_model", "=", "res.partner"), - ] - ) - self.assertFalse(attachments, "Attachments must be empty") - self.assertNotEqual( - len(self.partner.message_ids), - message_count, - "Message count must not be the same", - ) - last_message = self.partner.message_ids[0] - self.assertEqual( - last_message.subtype_id, - self.mt_attachment, - "Message subtypes must be the same", - ) - self.assertEqual( - last_message.author_id, - self.env.ref("base.user_root").partner_id, - "Message author must be OdooBot", - ) - self.assertIn( - "unlinked", last_message.body, "Message body must be contain 'unlinked'" - ) + attachment = self._create_attachment() + attachment._delete_and_notify() + self.assertEqual(len(self.partner.message_ids), 1) diff --git a/attachment_logging/views/res_config_settings_views.xml b/attachment_logging/views/res_config_settings_views.xml index fa9155907ac..2422dc5fa59 100644 --- a/attachment_logging/views/res_config_settings_views.xml +++ b/attachment_logging/views/res_config_settings_views.xml @@ -1,6 +1,5 @@ - res.config.settings -
    -
    -
    - -
    -
    - Attachment Logging -
    - Log a note in record chatter when an attachment is added or removed. -
    -
    -
    -
    + + + + +
    -
    From c0cfbdbf26d3417c44c86a4f8ab63e6925d19ab4 Mon Sep 17 00:00:00 2001 From: "r.perez" Date: Tue, 1 Apr 2025 16:02:23 -0400 Subject: [PATCH 04/14] [ADD] auto_backup_fs_file: introduce Auto Backup Fs File module with initial files and configurations --- auto_backup_fs_file/README.rst | 260 ++++++++ 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 | 292 ++++++++ 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 | 627 ++++++++++++++++++ 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 ++ oca_dependencies.txt | 1 + 30 files changed, 2027 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 create mode 100644 oca_dependencies.txt diff --git a/auto_backup_fs_file/README.rst b/auto_backup_fs_file/README.rst new file mode 100644 index 00000000000..66ca86a28fd --- /dev/null +++ b/auto_backup_fs_file/README.rst @@ -0,0 +1,260 @@ +=================== +Auto Backup Fs File +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:0b8048c71fd406f44c43adaa9fc156284a3b2ed3a70c0a026e7245ef182cc23d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--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. + +.. image:: https://raw.githubusercontent.com/OCA/server-tools/17.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. + +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. 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..bd3bd2040ee --- /dev/null +++ b/auto_backup_fs_file/i18n/auto_backup_fs_file.pot @@ -0,0 +1,292 @@ +# 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:17+0000\n" +"PO-Revision-Date: 2025-11-18 13:17+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 "" + +#. 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 +#: 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,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 +#. 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 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 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..b9a24e3e95c --- /dev/null +++ b/auto_backup_fs_file/static/description/index.html @@ -0,0 +1,627 @@ + + + + + +Auto Backup Fs File + + + +
    +

    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 + + + + + + + + +
    diff --git a/oca_dependencies.txt b/oca_dependencies.txt new file mode 100644 index 00000000000..fa780e25de5 --- /dev/null +++ b/oca_dependencies.txt @@ -0,0 +1 @@ +storage From fb502941275cada5ede449527a3a516731bf30c7 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 23 Jan 2026 12:36:18 +0000 Subject: [PATCH 05/14] [UPD] Update attachment_queue.pot --- attachment_queue/i18n/attachment_queue.pot | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/attachment_queue/i18n/attachment_queue.pot b/attachment_queue/i18n/attachment_queue.pot index 696a7866334..a4bb2e4ab98 100644 --- a/attachment_queue/i18n/attachment_queue.pot +++ b/attachment_queue/i18n/attachment_queue.pot @@ -188,6 +188,11 @@ msgstr "" msgid "File Content (raw)" msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_filename +msgid "File Name into the filesystem storage" +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size msgid "File Size" @@ -203,6 +208,26 @@ msgstr "" msgid "File type" msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_storage_id +msgid "Filesystem Storage" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_storage_code +msgid "Filesystem Storage Code" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_url +msgid "Filesystem URL" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_url_path +msgid "Filesystem URL Path" +msgstr "" + #. module: attachment_queue #: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search msgid "Filter on my documents" @@ -280,6 +305,11 @@ msgstr "" msgid "Indexed Content" msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__internal_url +msgid "Internal URL" +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower msgid "Is Follower" @@ -475,6 +505,26 @@ msgstr "" msgid "Stored Filename" msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_storage_code +msgid "" +"Technical code used to identify the storage backend into the code.This code " +"must be unique. This code is used for example to define the storage backend " +"to store the attachments via the configuration parameter " +"'ir_attachment.storage.force.database' when the module 'fs_attachment' is " +"installed." +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_url +msgid "The URL to access the file from the filesystem storage." +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__internal_url +msgid "The URL to access the file from the server." +msgstr "" + #. module: attachment_queue #: model:mail.template,subject:attachment_queue.attachment_failure_notification msgid "The attachment {{object.name}} has failed" @@ -487,11 +537,29 @@ msgid "" "data before their import in ERP or an export" msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_filename +msgid "" +"The name of the file in the filesystem storage.To preserve the mimetype and " +"the meaning of the filenamethe filename is computed from the name and the " +"extension" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_url_path +msgid "The path to access the file from the filesystem storage." +msgstr "" + #. module: attachment_queue #: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment msgid "The selected attachments will be rescheduled." msgstr "" +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_storage_id +msgid "The storage where the file is stored." +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type #: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search From 72fff6937769076a8b2d34d1b327a687d73a24b8 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 23 Jan 2026 12:36:19 +0000 Subject: [PATCH 06/14] [UPD] Update auto_backup_fs_file.pot --- .../i18n/auto_backup_fs_file.pot | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/auto_backup_fs_file/i18n/auto_backup_fs_file.pot b/auto_backup_fs_file/i18n/auto_backup_fs_file.pot index bd3bd2040ee..6b3ef2b1c35 100644 --- a/auto_backup_fs_file/i18n/auto_backup_fs_file.pot +++ b/auto_backup_fs_file/i18n/auto_backup_fs_file.pot @@ -6,8 +6,6 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-18 13:17+0000\n" -"PO-Revision-Date: 2025-11-18 13:17+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -120,6 +118,13 @@ msgstr "" 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" @@ -258,6 +263,12 @@ msgstr "" 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 "" @@ -282,6 +293,16 @@ msgstr "" 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 From 888432b4445ea87bca37c9778293c5f4c1a3b4a8 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 23 Jan 2026 12:36:22 +0000 Subject: [PATCH 07/14] [UPD] Update base_name_search_improved.pot --- .../i18n/base_name_search_improved.pot | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/base_name_search_improved/i18n/base_name_search_improved.pot b/base_name_search_improved/i18n/base_name_search_improved.pot index e6223889c85..3e71760def2 100644 --- a/base_name_search_improved/i18n/base_name_search_improved.pot +++ b/base_name_search_improved/i18n/base_name_search_improved.pot @@ -225,6 +225,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -476,6 +479,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search From ce312069ae0728a2183d4dafe79e35007a2d39c6 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 23 Jan 2026 12:43:54 +0000 Subject: [PATCH 08/14] [BOT] post-merge updates --- README.md | 1 + auto_backup_fs_file/README.rst | 105 +++++++++--------- .../static/description/index.html | 62 ++++++----- setup/_metapackage/pyproject.toml | 3 +- 4 files changed, 92 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 662f1868aa0..cef1bf9422e 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ addon | version | maintainers | summary [attachment_queue](attachment_queue/) | 17.0.1.0.0 | florian-dacosta sebastienbeau | Base module adding the concept of queue for processing files [auditlog](auditlog/) | 17.0.1.1.0 | | Audit Log [auto_backup](auto_backup/) | 17.0.1.1.0 | | Backups database +[auto_backup_fs_file](auto_backup_fs_file/) | 17.0.1.0.0 | | Store backups using some FSSPEC implementation [base_cron_exclusion](base_cron_exclusion/) | 17.0.1.0.0 | LoisRForgeFlow ChrisOForgeFlow | Allow you to select scheduled actions that should not run simultaneously. [base_exception](base_exception/) | 17.0.1.1.0 | hparfr sebastienbeau | This module provide an abstract model to manage customizable exceptions to be applied on different models (sale order, invoice, ...) [base_fontawesome](base_fontawesome/) | 17.0.1.1.0 | | Up to date Fontawesome resources. diff --git a/auto_backup_fs_file/README.rst b/auto_backup_fs_file/README.rst index 66ca86a28fd..0b52bbbd1af 100644 --- a/auto_backup_fs_file/README.rst +++ b/auto_backup_fs_file/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =================== Auto Backup Fs File =================== @@ -7,13 +11,13 @@ Auto Backup Fs File !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:0b8048c71fd406f44c43adaa9fc156284a3b2ed3a70c0a026e7245ef182cc23d + !! 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/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github @@ -65,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 @@ -85,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 ============ @@ -103,36 +107,37 @@ 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. -.. image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/auto_backup_fs_file/images/file_storage_configuration.png - :alt: Example of File Storage Configuration +|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 ===== @@ -174,24 +179,24 @@ 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 @@ -199,18 +204,18 @@ Notes 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 =========== @@ -233,14 +238,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 ----------- diff --git a/auto_backup_fs_file/static/description/index.html b/auto_backup_fs_file/static/description/index.html index b9a24e3e95c..967556011f1 100644 --- a/auto_backup_fs_file/static/description/index.html +++ b/auto_backup_fs_file/static/description/index.html @@ -3,7 +3,7 @@ -Auto Backup Fs File +README.rst -
    -

    Auto Backup Fs File

    +
    + + +Odoo Community Association + +
    +

    Auto Backup Fs File

    -

    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 @@ -418,7 +423,7 @@

    Auto Backup Fs File

    -

    Use Cases / Context

    +

    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 @@ -454,12 +459,12 @@

    Use Cases / Context

    -

    Installation

    +

    Installation

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

    -

    Configuration

    +

    Configuration

    1. Review Documentation for Dependencies Before configuring the module, ensure you have reviewed the documentation for the following @@ -488,7 +493,7 @@

      Configuration

    2. This step is part of the storage configuration process.
    3. Save the changes after verifying the setup.
    4. -Example of File Storage Configuration +

      Example of File Storage Configuration

      1. Verify Configuration
      @@ -501,14 +506,14 @@

      Configuration

      configured for storing backups in the desired file storage system.

    -

    Usage

    +

    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

    +

    How to Use the Module

    -

    1. Configure the Backup Method

    +

    1. Configure the Backup Method

    1. Navigate to Settings > Technical > Database Structure > Automated Backups.
    2. @@ -520,7 +525,7 @@

      1. Configure the Backup Method

    -

    2. Perform a Backup

    +

    2. Perform a Backup

    1. From the list of backup configurations, select the one configured with the Fs File method.
    2. @@ -529,7 +534,7 @@

      2. Perform a Backup

    -

    3. View Fs File Backups

    +

    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 @@ -539,7 +544,7 @@

      3. View Fs File Backups

    -

    4. Manage Fs File Backups

    +

    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.
    • @@ -547,17 +552,17 @@

      4. Manage Fs File Backups

    -

    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.
    • +
    • 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.
    @@ -565,14 +570,14 @@

    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 +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 @@ -581,7 +586,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 @@ -589,28 +594,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 @@ -623,5 +628,6 @@

    Maintainers

    +
    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index b44c570a4e9..5847a0781a2 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,10 +1,11 @@ [project] name = "odoo-addons-oca-server-tools" -version = "17.0.20251206.1" +version = "17.0.20260123.0" dependencies = [ "odoo-addon-attachment_queue>=17.0dev,<17.1dev", "odoo-addon-auditlog>=17.0dev,<17.1dev", "odoo-addon-auto_backup>=17.0dev,<17.1dev", + "odoo-addon-auto_backup_fs_file>=17.0dev,<17.1dev", "odoo-addon-base_cron_exclusion>=17.0dev,<17.1dev", "odoo-addon-base_exception>=17.0dev,<17.1dev", "odoo-addon-base_fontawesome>=17.0dev,<17.1dev", From 68c29741838737f366bec1a06bf235986204cad3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 23 Jan 2026 12:44:04 +0000 Subject: [PATCH 09/14] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: server-tools-17.0/server-tools-17.0-base_name_search_improved Translate-URL: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-base_name_search_improved/ --- base_name_search_improved/i18n/ca.po | 6 ++++++ base_name_search_improved/i18n/de.po | 6 ++++++ base_name_search_improved/i18n/es.po | 6 ++++++ base_name_search_improved/i18n/es_ES.po | 6 ++++++ base_name_search_improved/i18n/eu.po | 6 ++++++ base_name_search_improved/i18n/fi.po | 6 ++++++ base_name_search_improved/i18n/fr.po | 6 ++++++ base_name_search_improved/i18n/hr.po | 6 ++++++ base_name_search_improved/i18n/hr_HR.po | 6 ++++++ base_name_search_improved/i18n/it.po | 6 ++++++ base_name_search_improved/i18n/nb_NO.po | 6 ++++++ base_name_search_improved/i18n/nl.po | 6 ++++++ base_name_search_improved/i18n/pt_BR.po | 10 ++++++++-- base_name_search_improved/i18n/sl.po | 6 ++++++ base_name_search_improved/i18n/tr.po | 6 ++++++ base_name_search_improved/i18n/tr_TR.po | 6 ++++++ base_name_search_improved/i18n/zh_CN.po | 6 ++++++ 17 files changed, 104 insertions(+), 2 deletions(-) diff --git a/base_name_search_improved/i18n/ca.po b/base_name_search_improved/i18n/ca.po index 35b929c326c..81d68080cef 100644 --- a/base_name_search_improved/i18n/ca.po +++ b/base_name_search_improved/i18n/ca.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/de.po b/base_name_search_improved/i18n/de.po index 78e49b9e2c2..2ff1623f867 100644 --- a/base_name_search_improved/i18n/de.po +++ b/base_name_search_improved/i18n/de.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/es.po b/base_name_search_improved/i18n/es.po index e1052438417..a8c5d029998 100644 --- a/base_name_search_improved/i18n/es.po +++ b/base_name_search_improved/i18n/es.po @@ -266,6 +266,9 @@ msgstr "¿Búsqueda inteligente por nombre activada?" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -517,6 +520,9 @@ msgstr "¿Búsqueda inteligente por nombre activada?" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/es_ES.po b/base_name_search_improved/i18n/es_ES.po index b59ef214d6a..e12a4eb8053 100644 --- a/base_name_search_improved/i18n/es_ES.po +++ b/base_name_search_improved/i18n/es_ES.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/eu.po b/base_name_search_improved/i18n/eu.po index 290c7ceac02..f33e5d170f3 100644 --- a/base_name_search_improved/i18n/eu.po +++ b/base_name_search_improved/i18n/eu.po @@ -238,6 +238,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -489,6 +492,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/fi.po b/base_name_search_improved/i18n/fi.po index 81e3151aa44..2e9108c6a71 100644 --- a/base_name_search_improved/i18n/fi.po +++ b/base_name_search_improved/i18n/fi.po @@ -238,6 +238,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -489,6 +492,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/fr.po b/base_name_search_improved/i18n/fr.po index 934cb90eaa4..0c0ad956860 100644 --- a/base_name_search_improved/i18n/fr.po +++ b/base_name_search_improved/i18n/fr.po @@ -238,6 +238,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -489,6 +492,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/hr.po b/base_name_search_improved/i18n/hr.po index 4513ace1b22..9c56cbf3c32 100644 --- a/base_name_search_improved/i18n/hr.po +++ b/base_name_search_improved/i18n/hr.po @@ -239,6 +239,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -490,6 +493,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/hr_HR.po b/base_name_search_improved/i18n/hr_HR.po index 7014ed71651..efa9b24065d 100644 --- a/base_name_search_improved/i18n/hr_HR.po +++ b/base_name_search_improved/i18n/hr_HR.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/it.po b/base_name_search_improved/i18n/it.po index a4c9d4b76b8..e2d8a99830f 100644 --- a/base_name_search_improved/i18n/it.po +++ b/base_name_search_improved/i18n/it.po @@ -264,6 +264,9 @@ msgstr "Ricerca nome intelligente abilitata?" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -515,6 +518,9 @@ msgstr "Ricerca nome intelligente abilitata?" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/nb_NO.po b/base_name_search_improved/i18n/nb_NO.po index f4ed0d73f05..e7ed77b8cf2 100644 --- a/base_name_search_improved/i18n/nb_NO.po +++ b/base_name_search_improved/i18n/nb_NO.po @@ -239,6 +239,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -490,6 +493,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/nl.po b/base_name_search_improved/i18n/nl.po index 0d4f169510f..9e500841e61 100644 --- a/base_name_search_improved/i18n/nl.po +++ b/base_name_search_improved/i18n/nl.po @@ -238,6 +238,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -489,6 +492,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/pt_BR.po b/base_name_search_improved/i18n/pt_BR.po index ad996fe458e..4be63f91fc7 100644 --- a/base_name_search_improved/i18n/pt_BR.po +++ b/base_name_search_improved/i18n/pt_BR.po @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2017-10-28 11:05+0000\n" "PO-Revision-Date: 2017-10-28 11:05+0000\n" "Last-Translator: Armando Vulcano Junior , 2017\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" -"teams/23907/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/" +"23907/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -241,6 +241,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -492,6 +495,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/sl.po b/base_name_search_improved/i18n/sl.po index 3491f4a0ff8..34af1522d46 100644 --- a/base_name_search_improved/i18n/sl.po +++ b/base_name_search_improved/i18n/sl.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/tr.po b/base_name_search_improved/i18n/tr.po index 3d298dac423..a35b990d187 100644 --- a/base_name_search_improved/i18n/tr.po +++ b/base_name_search_improved/i18n/tr.po @@ -240,6 +240,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -491,6 +494,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/tr_TR.po b/base_name_search_improved/i18n/tr_TR.po index 0da83495a91..163987b3425 100644 --- a/base_name_search_improved/i18n/tr_TR.po +++ b/base_name_search_improved/i18n/tr_TR.po @@ -239,6 +239,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -490,6 +493,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search diff --git a/base_name_search_improved/i18n/zh_CN.po b/base_name_search_improved/i18n/zh_CN.po index d2aeeeabca2..fe9e3828c5e 100644 --- a/base_name_search_improved/i18n/zh_CN.po +++ b/base_name_search_improved/i18n/zh_CN.po @@ -239,6 +239,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_discuss_voice_metadata__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_fetchmail_server__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_format_address_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_file_gc__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_storage__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_fs_test_connection__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_google_gmail_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_html_field_history_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_iap_account__smart_search @@ -490,6 +493,9 @@ msgstr "" #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_resource_resource__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sequence_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_config__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_mixin__smart_search +#: model:ir.model.fields,field_description:base_name_search_improved.field_server_env_techname_mixin__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_composer__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend__smart_search #: model:ir.model.fields,field_description:base_name_search_improved.field_sms_resend_recipient__smart_search From 2d37266370d35d84ca667f3eb195f2829728bee0 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 23 Jan 2026 12:44:04 +0000 Subject: [PATCH 10/14] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: server-tools-17.0/server-tools-17.0-attachment_queue Translate-URL: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-attachment_queue/ --- attachment_queue/i18n/es.po | 68 +++++++++++++++++++++++++++++++++++ attachment_queue/i18n/it.po | 72 +++++++++++++++++++++++++++++++++++-- 2 files changed, 138 insertions(+), 2 deletions(-) diff --git a/attachment_queue/i18n/es.po b/attachment_queue/i18n/es.po index 7f0ec1845f4..85886513dde 100644 --- a/attachment_queue/i18n/es.po +++ b/attachment_queue/i18n/es.po @@ -216,6 +216,11 @@ msgstr "Contenido del Archivo (base64)" msgid "File Content (raw)" msgstr "Contenido del Archivo (sin procesar)" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_filename +msgid "File Name into the filesystem storage" +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size msgid "File Size" @@ -231,6 +236,26 @@ msgstr "Tipo de Archivo" msgid "File type" msgstr "Tipo de archivo" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_storage_id +msgid "Filesystem Storage" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_storage_code +msgid "Filesystem Storage Code" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_url +msgid "Filesystem URL" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__fs_url_path +msgid "Filesystem URL Path" +msgstr "" + #. module: attachment_queue #: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search msgid "Filter on my documents" @@ -308,6 +333,11 @@ msgstr "Anchura de la Imagen" msgid "Indexed Content" msgstr "Contenido Indexado" +#. module: attachment_queue +#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__internal_url +msgid "Internal URL" +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower msgid "Is Follower" @@ -507,6 +537,26 @@ msgstr "" msgid "Stored Filename" msgstr "Nombre del Archivo Almacenado" +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_storage_code +msgid "" +"Technical code used to identify the storage backend into the code.This code " +"must be unique. This code is used for example to define the storage backend " +"to store the attachments via the configuration parameter " +"'ir_attachment.storage.force.database' when the module 'fs_attachment' is " +"installed." +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_url +msgid "The URL to access the file from the filesystem storage." +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__internal_url +msgid "The URL to access the file from the server." +msgstr "" + #. module: attachment_queue #: model:mail.template,subject:attachment_queue.attachment_failure_notification msgid "The attachment {{object.name}} has failed" @@ -521,11 +571,29 @@ msgstr "" "El tipo de archivo determina el método de importación que se utilizará para " "analizar y transformar los datos antes de importarlos al ERP o exportarlos" +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_filename +msgid "" +"The name of the file in the filesystem storage.To preserve the mimetype and " +"the meaning of the filenamethe filename is computed from the name and the " +"extension" +msgstr "" + +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_url_path +msgid "The path to access the file from the filesystem storage." +msgstr "" + #. module: attachment_queue #: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment msgid "The selected attachments will be rescheduled." msgstr "Los anexos seleccionados se reprogramarán." +#. module: attachment_queue +#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__fs_storage_id +msgid "The storage where the file is stored." +msgstr "" + #. module: attachment_queue #: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type #: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search diff --git a/attachment_queue/i18n/it.po b/attachment_queue/i18n/it.po index 7651e5bcd56..89fb94d7592 100644 --- a/attachment_queue/i18n/it.po +++ b/attachment_queue/i18n/it.po @@ -40,8 +40,8 @@ msgstr "" "\">Salce,

    \n" "

    l'allegato ${object.name} ha un errore con il segente messaggio : " -"
    ${object.state_message}

    l'allegato ${object.name} ha un errore con il segente messaggio :
    $" +"{object.state_message}

    \n" "

    Date: Sun, 25 Jan 2026 22:31:11 +0000 Subject: [PATCH 11/14] [UPD] Update attachment_logging.pot --- .../i18n/attachment_logging.pot | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 attachment_logging/i18n/attachment_logging.pot diff --git a/attachment_logging/i18n/attachment_logging.pot b/attachment_logging/i18n/attachment_logging.pot new file mode 100644 index 00000000000..fa121c6ea2f --- /dev/null +++ b/attachment_logging/i18n/attachment_logging.pot @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_logging +# +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: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "%(username)s %(action)s a file: %(filename)s" +msgstr "" + +#. module: attachment_logging +#: model:ir.model,name:attachment_logging.model_ir_attachment +msgid "Attachment" +msgstr "" + +#. module: attachment_logging +#: model_terms:ir.ui.view,arch_db:attachment_logging.res_config_settings_form_view +msgid "Attachment Logging" +msgstr "" + +#. module: attachment_logging +#: model:mail.message.subtype,name:attachment_logging.mt_attachment +msgid "Attachments" +msgstr "" + +#. module: attachment_logging +#: model:ir.model,name:attachment_logging.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: attachment_logging +#: model_terms:ir.ui.view,arch_db:attachment_logging.res_config_settings_form_view +msgid "Log a note in record chatter when an attachment is added or removed." +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,help:attachment_logging.field_res_config_settings__use_attachment_log +msgid "Log attachment operations in chatter" +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,field_description:attachment_logging.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_logging.field_res_config_settings__smart_search +msgid "Smart Search" +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,field_description:attachment_logging.field_res_config_settings__use_attachment_log +msgid "Use Attachment Log" +msgstr "" + +#. module: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "attached" +msgstr "" + +#. module: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "unlinked" +msgstr "" From 39f68b7d5ca19d5b4d4ee6f7b8900234552e41b8 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 25 Jan 2026 22:38:46 +0000 Subject: [PATCH 12/14] [BOT] post-merge updates --- README.md | 1 + attachment_logging/README.rst | 8 +++-- .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 30 +++++++++++------- setup/_metapackage/pyproject.toml | 3 +- 5 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 attachment_logging/static/description/icon.png diff --git a/README.md b/README.md index cef1bf9422e..27fced4e853 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- +[attachment_logging](attachment_logging/) | 17.0.1.0.0 | | Show attachment information in chatter [attachment_queue](attachment_queue/) | 17.0.1.0.0 | florian-dacosta sebastienbeau | Base module adding the concept of queue for processing files [auditlog](auditlog/) | 17.0.1.1.0 | | Audit Log [auto_backup](auto_backup/) | 17.0.1.1.0 | | Backups database diff --git a/attachment_logging/README.rst b/attachment_logging/README.rst index 9041ebd212d..28348613344 100644 --- a/attachment_logging/README.rst +++ b/attachment_logging/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ================== Attachment Logging ================== @@ -7,13 +11,13 @@ Attachment Logging !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:7521c926362a2aa9cf7e326ec6a1d689d7824a617c9076a364251d23d16ee51d + !! source digest: sha256:61878ebe5df7c1dfd773c842b660cb795baa2d5ab9363557168a8c54ebd47d29 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github diff --git a/attachment_logging/static/description/icon.png b/attachment_logging/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 -Attachment Logging +README.rst -

    -

    Attachment Logging

    +
    + + +Odoo Community Association + +
    +

    Attachment Logging

    -

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

    +

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

    This module shows attachment information in chatter. Following data is displayed:

      @@ -392,7 +397,7 @@

      Attachment Logging

    -

    Configuration

    +

    Configuration

    To enable note logging of attachment operations in record chatter:

    • Go to “Settings > General Settings” and scroll to the “Discuss” @@ -402,13 +407,13 @@

      Configuration

      image

    -

    Usage

    +

    Usage

    Create date and user are displayed next to attachments in chatter. When attachment is added or removed a note is logged in chatter if the corresponding option is enabled in the General Settings.

    -

    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 @@ -416,15 +421,15 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Cetmix
    -

    Contributors

    +

    Contributors

    • Cetmix <cetmix.com>
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -451,5 +456,6 @@

    Maintainers

    +
    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 5847a0781a2..4ea8ac45dbe 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,7 +1,8 @@ [project] name = "odoo-addons-oca-server-tools" -version = "17.0.20260123.0" +version = "17.0.20260125.0" dependencies = [ + "odoo-addon-attachment_logging>=17.0dev,<17.1dev", "odoo-addon-attachment_queue>=17.0dev,<17.1dev", "odoo-addon-auditlog>=17.0dev,<17.1dev", "odoo-addon-auto_backup>=17.0dev,<17.1dev", From 702c0cee43776b952bc5dcab6c8e0796acff1db6 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 26 Jan 2026 08:46:36 +0000 Subject: [PATCH 13/14] Added translation using Weblate (Italian) --- attachment_logging/i18n/it.po | 77 +++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 attachment_logging/i18n/it.po diff --git a/attachment_logging/i18n/it.po b/attachment_logging/i18n/it.po new file mode 100644 index 00000000000..cadda644d9c --- /dev/null +++ b/attachment_logging/i18n/it.po @@ -0,0 +1,77 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_logging +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\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" + +#. module: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "%(username)s %(action)s a file: %(filename)s" +msgstr "" + +#. module: attachment_logging +#: model:ir.model,name:attachment_logging.model_ir_attachment +msgid "Attachment" +msgstr "" + +#. module: attachment_logging +#: model_terms:ir.ui.view,arch_db:attachment_logging.res_config_settings_form_view +msgid "Attachment Logging" +msgstr "" + +#. module: attachment_logging +#: model:mail.message.subtype,name:attachment_logging.mt_attachment +msgid "Attachments" +msgstr "" + +#. module: attachment_logging +#: model:ir.model,name:attachment_logging.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: attachment_logging +#: model_terms:ir.ui.view,arch_db:attachment_logging.res_config_settings_form_view +msgid "Log a note in record chatter when an attachment is added or removed." +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,help:attachment_logging.field_res_config_settings__use_attachment_log +msgid "Log attachment operations in chatter" +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,field_description:attachment_logging.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_logging.field_res_config_settings__smart_search +msgid "Smart Search" +msgstr "" + +#. module: attachment_logging +#: model:ir.model.fields,field_description:attachment_logging.field_res_config_settings__use_attachment_log +msgid "Use Attachment Log" +msgstr "" + +#. module: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "attached" +msgstr "" + +#. module: attachment_logging +#. odoo-python +#: code:addons/attachment_logging/models/ir_attachment.py:0 +#, python-format +msgid "unlinked" +msgstr "" From f95567830e34cd7da957af22138b025a4a54e957 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 26 Jan 2026 08:46:44 +0000 Subject: [PATCH 14/14] Added translation using Weblate (Italian) --- auto_backup_fs_file/i18n/it.po | 314 +++++++++++++++++++++++++++++++++ 1 file changed, 314 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..c165797b07a --- /dev/null +++ b/auto_backup_fs_file/i18n/it.po @@ -0,0 +1,314 @@ +# 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: Automatically generated\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" + +#. 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 ""

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