diff --git a/README.md b/README.md index 52228a49b..b18c6b203 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,11 @@ addon | version | maintainers | summary [mail_drop_target](mail_drop_target/) | 18.0.1.0.1 | | Attach emails to Odoo by dragging them from your desktop [mail_extra_header](mail_extra_header/) | 18.0.1.0.0 | | Adds extra headers per mail server to sent mails. [mail_force_email_notification](mail_force_email_notification/) | 18.0.1.0.0 | | Context key to define notifications to be sent by emaildefined by force_notification_by_email context key +[mail_forward](mail_forward/) | 18.0.1.0.0 | carlos-lopez-tecnativa | Forward messages from the chatter of any document to other users. [mail_inline_css](mail_inline_css/) | 18.0.1.0.0 | | Convert style tags in inline style in your mails [mail_layout_preview](mail_layout_preview/) | 18.0.1.0.0 | | Preview email templates in the browser [mail_message_search](mail_message_search/) | 18.0.1.0.2 | yostashiro aungkokolin1997 | Mail Message Search +[mail_no_user_assign_notification](mail_no_user_assign_notification/) | 18.0.1.0.0 | victoralmau | Mail No user Assign Notification [mail_notification_clean_status_error](mail_notification_clean_status_error/) | 18.0.1.0.0 | sebalix | Extend Odoo scheduled action to also delete notifications in error. [mail_notification_custom_subject](mail_notification_custom_subject/) | 18.0.1.0.0 | yajo | Apply a custom subject to mail notifications [mail_optional_autofollow](mail_optional_autofollow/) | 18.0.1.0.0 | | Choose if you want to automatically add new recipients as followers on mail.compose.message @@ -46,9 +48,9 @@ addon | version | maintainers | summary [mail_outbound_static](mail_outbound_static/) | 18.0.1.0.1 | | Allows you to configure the from header for a mail server. [mail_partner_forwarding](mail_partner_forwarding/) | 18.0.1.0.0 | | Forwarding notifications for partners [mail_partner_opt_out](mail_partner_opt_out/) | 18.0.1.0.0 | | Add the partner's email to the blackmailed list -[mail_post_defer](mail_post_defer/) | 18.0.1.0.0 | Yajo | Faster and cancellable outgoing messages +[mail_post_defer](mail_post_defer/) | 18.0.1.0.1 | Yajo | Faster and cancellable outgoing messages [mail_quoted_reply](mail_quoted_reply/) | 18.0.1.0.0 | | Make a reply using a message -[mail_restrict_follower_selection](mail_restrict_follower_selection/) | 18.0.1.0.0 | | Define a domain from which followers can be selected +[mail_restrict_follower_selection](mail_restrict_follower_selection/) | 18.0.1.1.0 | | Define a domain from which followers can be selected [mail_send_confirmation](mail_send_confirmation/) | 18.0.1.0.0 | | Mail Send Confirmation [mail_show_follower](mail_show_follower/) | 18.0.1.0.2 | yajo | Show CC document followers in mails. [mail_suggested_recipient_unchecked](mail_suggested_recipient_unchecked/) | 18.0.1.0.0 | victoralmau | Mail suggested recipient unchecked diff --git a/mail_activity_team/i18n/it.po b/mail_activity_team/i18n/it.po index 31f62cd26..59132e078 100644 --- a/mail_activity_team/i18n/it.po +++ b/mail_activity_team/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-12-14 21:42+0000\n" +"PO-Revision-Date: 2026-02-18 11:09+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10.4\n" +"X-Generator: Weblate 5.15.2\n" #. module: mail_activity_team #. odoo-javascript @@ -109,7 +109,7 @@ msgstr "Ultimo aggiornamento di" #. module: mail_activity_team #: model:ir.model.fields,field_description:mail_activity_team.field_mail_activity_team__write_date msgid "Last Updated on" -msgstr "Ultima Modifica il" +msgstr "Ultimo aggiornamento il" #. module: mail_activity_team #: model:ir.model,name:mail_activity_team.model_mail_activity_team diff --git a/mail_forward/README.rst b/mail_forward/README.rst new file mode 100644 index 000000000..fbb07ac6b --- /dev/null +++ b/mail_forward/README.rst @@ -0,0 +1,123 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +==================== +Mail Forward Message +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:19e58a575d762a3eafc85e4ed9ae051aa7c39dc0a342eed2b1fd4c5b6e3af561 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-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%2Fmail-lightgray.png?logo=github + :target: https://github.com/OCA/mail/tree/18.0/mail_forward + :alt: OCA/mail +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/mail-18-0/mail-18-0-mail_forward + :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/mail&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows users to forward messages from the chatter of any +document to: + +- Other users in the same thread, adding them as followers of the + document without notifying the current followers. +- Another thread, but not adding them as followers—only notifying the + current followers of the other thread. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To enable a model to forward messages to another thread: + +- With debug mode activated, go to + ``Settings -> Technical -> Database Structure -> Models``. +- Search for the model you wish to enable. +- Mark the option ``Enable Forward To`` and save. Transient models or + those without mail thread won't have this check visible. + +Usage +===== + +To use this module, follow these steps: + +- Navigate to the chatter of any document. +- Hover the mouse over any message in the chatter (excluding internal + notes). +- A Forward icon will appear next to the message. +- Click the button to display a wizard with the message. +- Select the forward type (current thread or another thread). +- Select the users to forward the message to, or select the other thread + according to the previous step. +- Click the 'Send Mail' button to send the message to the selected users + or thread. + +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 +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Carlos López + +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. + +.. |maintainer-carlos-lopez-tecnativa| image:: https://github.com/carlos-lopez-tecnativa.png?size=40px + :target: https://github.com/carlos-lopez-tecnativa + :alt: carlos-lopez-tecnativa + +Current `maintainer `__: + +|maintainer-carlos-lopez-tecnativa| + +This module is part of the `OCA/mail `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_forward/__init__.py b/mail_forward/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/mail_forward/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/mail_forward/__manifest__.py b/mail_forward/__manifest__.py new file mode 100644 index 000000000..c9a24f028 --- /dev/null +++ b/mail_forward/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2024 Tecnativa - Carlos Lopez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Mail Forward Message", + "version": "18.0.1.0.0", + "summary": "Forward messages from the chatter of any document to other users.", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/mail", + "depends": ["mail", "contacts"], + "data": ["wizards/mail_compose_message_view.xml", "views/ir_model_views.xml"], + "assets": { + "web.assets_backend": [ + "mail_forward/static/src/**/*.esm.js", + "mail_forward/static/src/**/*.xml", + ], + "web.assets_tests": [ + "mail_forward/static/tests/tours/**/*", + ], + }, + "installable": True, + "auto_install": False, + "license": "AGPL-3", + "maintainers": ["carlos-lopez-tecnativa"], +} diff --git a/mail_forward/i18n/ca.po b/mail_forward/i18n/ca.po new file mode 100644 index 000000000..67c8aa5e4 --- /dev/null +++ b/mail_forward/i18n/ca.po @@ -0,0 +1,163 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_forward +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-19 09:25+0000\n" +"Last-Translator: jabelchi \n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "---------- Forwarded message ---------" +msgstr "---------- Missatge reenviat ---------" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__another_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__another_thread +msgid "Another thread" +msgstr "Un altre fil" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__current_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__current_thread +msgid "Current thread" +msgstr "Fil actual" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Date" +msgstr "Data" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_thread +msgid "Email Thread" +msgstr "Fil de correus" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistent de redacció de correus" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_ir_model__enable_forward_to +msgid "Enable Forward To" +msgstr "Habilita reenviament" + +#. module: mail_forward +#: model:ir.model.fields,help:mail_forward.field_ir_model__enable_forward_to +msgid "Enable forwarding messages to records of this model." +msgstr "Habilita reenviament de missatges a registres d'aquest model." + +#. module: mail_forward +#: model_terms:ir.ui.view,arch_db:mail_forward.mail_compose_message_forward_form +msgid "Followers to notify" +msgstr "Seguidors a notificar" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#: code:addons/mail_forward/static/src/core/common/message_actions.esm.js:0 +#, python-format +msgid "Forward" +msgstr "Reenvia" + +#. module: mail_forward +#. odoo-javascript +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message" +msgstr "Reenvia missatge" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Center" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Left" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Right" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_type +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_type +msgid "Forward Type" +msgstr "Tipus de reenviament" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "From" +msgstr "De" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Fwd:" +msgstr "Rv:" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_message +msgid "Message" +msgstr "Missatge" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_ir_model +msgid "Models" +msgstr "Models" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Re:" +msgstr "Re:" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Subject" +msgstr "Assumpte" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_thread +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_thread +msgid "Thread to forward" +msgstr "Fil pel reenviament" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "To" +msgstr "A" diff --git a/mail_forward/i18n/es.po b/mail_forward/i18n/es.po new file mode 100644 index 000000000..cd270aaf7 --- /dev/null +++ b/mail_forward/i18n/es.po @@ -0,0 +1,164 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_forward +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-27 17:26+0000\n" +"PO-Revision-Date: 2025-01-27 12:28-0500\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.5\n" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "---------- Forwarded message ---------" +msgstr "---------- Mensaje reenviado ---------" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__another_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__another_thread +msgid "Another thread" +msgstr "Otro hilo" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__current_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__current_thread +msgid "Current thread" +msgstr "Hilo actual" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Date" +msgstr "Fecha" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_thread +msgid "Email Thread" +msgstr "Hilo de correos electrónicos" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Asistente de redacción de correo electrónico" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_ir_model__enable_forward_to +msgid "Enable Forward To" +msgstr "Habilitar reenvío a" + +#. module: mail_forward +#: model:ir.model.fields,help:mail_forward.field_ir_model__enable_forward_to +msgid "Enable forwarding messages to records of this model." +msgstr "Habilita el reenvío de mensajes a registros de este modelo." + +#. module: mail_forward +#: model_terms:ir.ui.view,arch_db:mail_forward.mail_compose_message_forward_form +msgid "Followers to notify" +msgstr "Seguidores a notificar" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#: code:addons/mail_forward/static/src/core/common/message_actions.esm.js:0 +#, python-format +msgid "Forward" +msgstr "Reenviar" + +#. module: mail_forward +#. odoo-javascript +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message" +msgstr "Reenviar mensaje" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Center" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Left" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Right" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_type +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_type +msgid "Forward Type" +msgstr "Tipo de reenvío" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "From" +msgstr "De" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Fwd:" +msgstr "RV:" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_message +msgid "Message" +msgstr "Mensaje" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_ir_model +msgid "Models" +msgstr "Modelos" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Re:" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Subject" +msgstr "Asunto" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_thread +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_thread +msgid "Thread to forward" +msgstr "Hilo a reenviar" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "To" +msgstr "Para" diff --git a/mail_forward/i18n/it.po b/mail_forward/i18n/it.po new file mode 100644 index 000000000..97508a7c7 --- /dev/null +++ b/mail_forward/i18n/it.po @@ -0,0 +1,163 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_forward +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-01-30 13:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "---------- Forwarded message ---------" +msgstr "---------- Messaggio inoltrato ---------" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__another_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__another_thread +msgid "Another thread" +msgstr "Un'altra discussione" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_gateway_message__forward_type__current_thread +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__current_thread +msgid "Current thread" +msgstr "Discussione attuale" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Date" +msgstr "Data" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_thread +msgid "Email Thread" +msgstr "Discussione e-mail" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Procedura guidata creazione e-mail" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_ir_model__enable_forward_to +msgid "Enable Forward To" +msgstr "Abilita inoltro a" + +#. module: mail_forward +#: model:ir.model.fields,help:mail_forward.field_ir_model__enable_forward_to +msgid "Enable forwarding messages to records of this model." +msgstr "Abilita messaggi inoltro ai record di questo modello." + +#. module: mail_forward +#: model_terms:ir.ui.view,arch_db:mail_forward.mail_compose_message_forward_form +msgid "Followers to notify" +msgstr "Sottoscritti da avvisare" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#: code:addons/mail_forward/static/src/core/common/message_actions.esm.js:0 +#, python-format +msgid "Forward" +msgstr "Inoltra" + +#. module: mail_forward +#. odoo-javascript +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message" +msgstr "Inoltra messaggio" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Center" +msgstr "Centro inoltro messaggio" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Left" +msgstr "Inoltra messaggio precedente" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#, python-format +msgid "Forward Message Right" +msgstr "Inoltra messaggio successivo" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_type +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_type +msgid "Forward Type" +msgstr "Tipo inoltro" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "From" +msgstr "Da" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Fwd:" +msgstr "In.:" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_message +msgid "Message" +msgstr "Messaggio" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_ir_model +msgid "Models" +msgstr "Modelli" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +#, python-format +msgid "Re:" +msgstr "Re:" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "Subject" +msgstr "Oggetto" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_gateway_message__forward_thread +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_thread +msgid "Thread to forward" +msgstr "Discussione da inoltrare" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#, python-format +msgid "To" +msgstr "A" diff --git a/mail_forward/i18n/mail_forward.pot b/mail_forward/i18n/mail_forward.pot new file mode 100644 index 000000000..78c037ab3 --- /dev/null +++ b/mail_forward/i18n/mail_forward.pot @@ -0,0 +1,144 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_forward +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +msgid "---------- Forwarded message ---------" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__another_thread +msgid "Another thread" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields.selection,name:mail_forward.selection__mail_compose_message__forward_type__current_thread +msgid "Current thread" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +msgid "Date" +msgstr "" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_ir_model__enable_forward_to +msgid "Enable Forward To" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,help:mail_forward.field_ir_model__enable_forward_to +msgid "Enable forwarding messages to records of this model." +msgstr "" + +#. module: mail_forward +#: model_terms:ir.ui.view,arch_db:mail_forward.mail_compose_message_forward_form +msgid "Followers to notify" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +#: code:addons/mail_forward/static/src/core/common/message_actions.esm.js:0 +msgid "Forward" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +msgid "Forward Message" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +msgid "Forward Message Center" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +msgid "Forward Message Left" +msgstr "" + +#. module: mail_forward +#. odoo-javascript +#: code:addons/mail_forward/static/src/components/forward_message/forward_message.xml:0 +msgid "Forward Message Right" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_type +msgid "Forward Type" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +msgid "From" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +msgid "Fwd:" +msgstr "" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_mail_message +msgid "Message" +msgstr "" + +#. module: mail_forward +#: model:ir.model,name:mail_forward.model_ir_model +msgid "Models" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/wizards/mail_compose_message.py:0 +msgid "Re:" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +msgid "Subject" +msgstr "" + +#. module: mail_forward +#: model:ir.model.fields,field_description:mail_forward.field_mail_compose_message__forward_thread +msgid "Thread to forward" +msgstr "" + +#. module: mail_forward +#. odoo-python +#: code:addons/mail_forward/models/mail_message.py:0 +msgid "To" +msgstr "" diff --git a/mail_forward/models/__init__.py b/mail_forward/models/__init__.py new file mode 100644 index 000000000..c5692d315 --- /dev/null +++ b/mail_forward/models/__init__.py @@ -0,0 +1,3 @@ +from . import ir_model +from . import mail_message +from . import mail_thread diff --git a/mail_forward/models/ir_model.py b/mail_forward/models/ir_model.py new file mode 100644 index 000000000..8ded28e17 --- /dev/null +++ b/mail_forward/models/ir_model.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class IrModel(models.Model): + _inherit = "ir.model" + + enable_forward_to = fields.Boolean( + help="Enable forwarding messages to records of this model." + ) diff --git a/mail_forward/models/mail_message.py b/mail_forward/models/mail_message.py new file mode 100644 index 000000000..d30a8638e --- /dev/null +++ b/mail_forward/models/mail_message.py @@ -0,0 +1,55 @@ +# Copyright 2024 Tecnativa - Carlos Lopez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import models +from odoo.tools import format_datetime + + +class MailMessage(models.Model): + _inherit = "mail.message" + + def action_wizard_forward(self): + view = self.env.ref("mail_forward.mail_compose_message_forward_form").sudo() + action = self.env["ir.actions.actions"]._for_xml_id( + "mail.action_email_compose_message_wizard" + ) + action["name"] = self.env._("Forward Message") + action["view_mode"] = view.type + action["views"] = [(view.id, view.type)] + action["context"] = { + "default_model": self.model, + "default_res_ids": [self.res_id], + "default_composition_mode": "comment", + "default_is_log": False, + "default_notify": True, + "force_email": True, + "message_forwarded_id": self.id, + } + return action + + def _build_message_body_for_forward(self): + partner_emails = [ + partner.email_formatted + for partner in self.partner_ids + if partner.email_formatted + ] + return """ +


+ {str_forwarded_message}
+ {str_from}: {email_from}
+ {str_date}: {date}
+ {str_subject}: {subject}
+ {str_to}: {to}
+

+ {body} + """.format( + str_forwarded_message=self.env._("---------- Forwarded message ---------"), + email_from=self.email_from, + date=format_datetime(self.env, self.date), + subject=self.subject, + to=", ".join(partner_emails), + str_date=self.env._("Date"), + str_subject=self.env._("Subject"), + str_from=self.env._("From"), + str_to=self.env._("To"), + body=self.body, + ) diff --git a/mail_forward/models/mail_thread.py b/mail_forward/models/mail_thread.py new file mode 100644 index 000000000..919c8747d --- /dev/null +++ b/mail_forward/models/mail_thread.py @@ -0,0 +1,22 @@ +# Copyright 2024 Tecnativa - Carlos Lopez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import models + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def _notify_get_recipients(self, message, msg_vals, **kwargs): + recipients_data = super()._notify_get_recipients(message, msg_vals, **kwargs) + # only notify to explicit partners, remove others(followers). + if ( + self.env.context.get("message_forwarded_id") + and self.env.context.get("forward_type", "") == "current_thread" + ): + current_partners_ids = message.partner_ids.ids + new_recipeints = [] + for recipeint in recipients_data: + if recipeint["id"] in current_partners_ids: + new_recipeints.append(recipeint) + recipients_data = new_recipeints + return recipients_data diff --git a/mail_forward/pyproject.toml b/mail_forward/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/mail_forward/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/mail_forward/readme/CONFIGURE.md b/mail_forward/readme/CONFIGURE.md new file mode 100644 index 000000000..68629226b --- /dev/null +++ b/mail_forward/readme/CONFIGURE.md @@ -0,0 +1,5 @@ +To enable a model to forward messages to another thread: + +- With debug mode activated, go to `Settings -> Technical -> Database Structure -> Models`. +- Search for the model you wish to enable. +- Mark the option `Enable Forward To` and save. Transient models or those without mail thread won't have this check visible. \ No newline at end of file diff --git a/mail_forward/readme/CONTRIBUTORS.md b/mail_forward/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..e91f80b2e --- /dev/null +++ b/mail_forward/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://www.tecnativa.com): + - Carlos López diff --git a/mail_forward/readme/DESCRIPTION.md b/mail_forward/readme/DESCRIPTION.md new file mode 100644 index 000000000..872600afc --- /dev/null +++ b/mail_forward/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module allows users to forward messages from the chatter of any document to: +- Other users in the same thread, adding them as followers of the document without notifying the current followers. +- Another thread, but not adding them as followers—only notifying the current followers of the other thread. \ No newline at end of file diff --git a/mail_forward/readme/USAGE.md b/mail_forward/readme/USAGE.md new file mode 100644 index 000000000..18fc63e58 --- /dev/null +++ b/mail_forward/readme/USAGE.md @@ -0,0 +1,11 @@ +To use this module, follow these steps: + +- Navigate to the chatter of any document. +- Hover the mouse over any message in the chatter (excluding internal + notes). +- A Forward icon will appear next to the message. +- Click the button to display a wizard with the message. +- Select the forward type (current thread or another thread). +- Select the users to forward the message to, or select the other thread according to the previous step. +- Click the 'Send Mail' button to send the message to the selected users or thread. + \ No newline at end of file diff --git a/mail_forward/static/description/icon.png b/mail_forward/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/mail_forward/static/description/icon.png differ diff --git a/mail_forward/static/description/index.html b/mail_forward/static/description/index.html new file mode 100644 index 000000000..2ad7ecd9e --- /dev/null +++ b/mail_forward/static/description/index.html @@ -0,0 +1,470 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Mail Forward Message

+ +

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

+

This module allows users to forward messages from the chatter of any +document to:

+
    +
  • Other users in the same thread, adding them as followers of the +document without notifying the current followers.
  • +
  • Another thread, but not adding them as followers—only notifying the +current followers of the other thread.
  • +
+

Table of contents

+ +
+

Configuration

+

To enable a model to forward messages to another thread:

+
    +
  • With debug mode activated, go to +Settings -> Technical -> Database Structure -> Models.
  • +
  • Search for the model you wish to enable.
  • +
  • Mark the option Enable Forward To and save. Transient models or +those without mail thread won’t have this check visible.
  • +
+
+
+

Usage

+

To use this module, follow these steps:

+
    +
  • Navigate to the chatter of any document.
  • +
  • Hover the mouse over any message in the chatter (excluding internal +notes).
  • +
  • A Forward icon will appear next to the message.
  • +
  • Click the button to display a wizard with the message.
  • +
  • Select the forward type (current thread or another thread).
  • +
  • Select the users to forward the message to, or select the other thread +according to the previous step.
  • +
  • Click the ‘Send Mail’ button to send the message to the selected users +or thread.
  • +
+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

carlos-lopez-tecnativa

+

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

+

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

+
+
+
+
+ + diff --git a/mail_forward/static/src/components/forward_message/forward_message.esm.js b/mail_forward/static/src/components/forward_message/forward_message.esm.js new file mode 100644 index 000000000..49d27a536 --- /dev/null +++ b/mail_forward/static/src/components/forward_message/forward_message.esm.js @@ -0,0 +1,31 @@ +/* Copyright 2024 Tecnativa - Carlos Lopez + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +*/ +const {Component} = owl; + +export class ForwardMessage extends Component { + async onClickForwardMessage() { + const action = await this.env.services.orm.call( + "mail.message", + "action_wizard_forward", + [[this.props.message.id]] + ); + this.env.services.action.doAction(action, { + additionalContext: { + active_id: this.props.message.id, + active_ids: [this.props.message.id], + active_model: "mail.message", + }, + onClose: () => { + if (this.props.message.thread) { + this.props.message.thread.fetchNewMessages(); + } + }, + }); + } +} + +ForwardMessage.template = "mail_forward.ForwardMessage"; +ForwardMessage.props = { + message: Object, +}; diff --git a/mail_forward/static/src/components/forward_message/forward_message.xml b/mail_forward/static/src/components/forward_message/forward_message.xml new file mode 100644 index 000000000..cab680d73 --- /dev/null +++ b/mail_forward/static/src/components/forward_message/forward_message.xml @@ -0,0 +1,34 @@ + + + +
+ + + + + + Forward +
+
+
diff --git a/mail_forward/static/src/core/common/message_actions.esm.js b/mail_forward/static/src/core/common/message_actions.esm.js new file mode 100644 index 000000000..1d9b78eea --- /dev/null +++ b/mail_forward/static/src/core/common/message_actions.esm.js @@ -0,0 +1,16 @@ +/* Copyright 2024 Tecnativa - Carlos Lopez + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +*/ + +import {ForwardMessage} from "../../components/forward_message/forward_message.esm"; +import {_t} from "@web/core/l10n/translation"; +import {messageActionsRegistry} from "@mail/core/common/message_actions"; + +messageActionsRegistry.add("forward", { + callComponent: ForwardMessage, + props: (component) => ({message: component.props.message}), + condition: (component) => + component.props.message.is_discussion && !component.props.message.is_note, + sequence: 75, + title: _t("Forward"), +}); diff --git a/mail_forward/static/tests/tours/mail_forward.esm.js b/mail_forward/static/tests/tours/mail_forward.esm.js new file mode 100644 index 000000000..b344c0bf0 --- /dev/null +++ b/mail_forward/static/tests/tours/mail_forward.esm.js @@ -0,0 +1,91 @@ +import {registry} from "@web/core/registry"; + +const contact_steps = [ + { + trigger: ".o_navbar_apps_menu button", + run: "click", + }, + { + trigger: '.o_app[data-menu-xmlid="contacts.menu_contacts"]', + run: "click", + }, + { + content: "Search Contact", + trigger: ".o_searchview_input", + run: "edit Test Forward", + }, + { + trigger: ".o_menu_item", + content: "Validate search", + run: "click", + }, + { + content: "Switch to list view", + trigger: ".o_list", + run: "click", + }, + { + content: "Open contact", + trigger: ".o_list_table td[name='complete_name']:contains('Test Forward')", + run: "click", + }, +]; +registry.category("web_tour.tours").add("mail_forward.mail_forward_tour", { + test: true, + url: "/web", + steps: () => [ + ...contact_steps, + { + content: "Hover a message to show actions", + trigger: "div.o-mail-Message[aria-label='Message']", + run: "hover", + }, + { + content: "Click message options button", + trigger: "div.o-mail-Message-actions button.dropdown-toggle", + run: "click", + }, + { + content: "Forward a message", + trigger: ".mail_forward_message", + run: "click", + }, + { + content: "Select a Forward", + trigger: ".o_field_widget[name=partner_ids] input", + run: "edit Forward", + }, + { + content: "Valid Forward", + trigger: ".ui-menu-item a:contains(Forward)", + run: "click", + }, + { + content: "Send mail", + trigger: "button.o_mail_send", + run: "click", + }, + { + content: "Check Mail Forward", + trigger: + "div.o-mail-Message[aria-label='Message']:contains(---------- Forwarded message ---------)", + }, + ], +}); + +registry.category("web_tour.tours").add("mail_forward.mail_note_not_forward_tour", { + test: true, + url: "/web", + steps: () => [ + ...contact_steps, + { + content: "Hover a note", + trigger: "div.o-mail-Message[aria-label='Note']", + run: "click", + }, + { + content: "Verify that the Forward button does not exist.", + trigger: "div.o-mail-Message[aria-label='Note']:not(.mail_forward_message)", + }, + ], +}); diff --git a/mail_forward/tests/__init__.py b/mail_forward/tests/__init__.py new file mode 100644 index 000000000..d83263f3c --- /dev/null +++ b/mail_forward/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_forward diff --git a/mail_forward/tests/test_mail_forward.py b/mail_forward/tests/test_mail_forward.py new file mode 100644 index 000000000..f3df32efd --- /dev/null +++ b/mail_forward/tests/test_mail_forward.py @@ -0,0 +1,152 @@ +# Copyright 2024 Tecnativa - Carlos Lopez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo.tests import Form, RecordCapturer, tagged +from odoo.tests.common import HttpCase, users + +from odoo.addons.mail.tests.common import mail_new_test_user +from odoo.addons.mail.tests.test_mail_composer import TestMailComposer + + +@tagged("post_install", "-at_install") +class TestMailForward(TestMailComposer, HttpCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_test = mail_new_test_user( + cls.env, + login="user_test_forward", + groups="base.group_user,base.group_partner_manager", + ) + cls.test_record.write({"name": "Test Forward", "email": "test@example.com"}) + cls.partner_follower1 = cls.env["res.partner"].create( + {"name": "Follower1", "email": "follower1@example.com"} + ) + cls.partner_follower2 = cls.env["res.partner"].create( + {"name": "Follower2", "email": "follower2@example.com"} + ) + cls.partner_forward = cls.env["res.partner"].create( + {"name": "Forward", "email": "forward@example.com"} + ) + cls.env["ir.model"]._get("res.partner").enable_forward_to = True + + @users("user_test_forward") + def test_01_mail_forward(self): + """ + Send an email to followers + and forward it to another partner. + """ + ctx = { + "default_model": self.test_record._name, + "default_res_ids": [self.test_record.id], + } + composer_form = Form(self.env["mail.compose.message"].with_context(**ctx)) + composer_form.body = "

Hello

" + composer_form.partner_ids.add(self.partner_follower1) + composer_form.partner_ids.add(self.partner_follower2) + composer = composer_form.save() + with self.mock_mail_gateway(): + composer._action_send_mail() + # Verify the followers of mail.message + message = self.test_record.message_ids[0] + self.assertEqual(len(message.partner_ids), 2) + self.assertIn(self.partner_follower1, message.partner_ids) + self.assertIn(self.partner_follower2, message.partner_ids) + self.assertNotIn(self.partner_forward, message.partner_ids) + self.assertNotIn("---------- Forwarded message ---------", message.body) + # Forward the email + # only the partner_forward should receive the email + action_forward = message.action_wizard_forward() + Message = self.env["mail.compose.message"].with_context( + **action_forward["context"] + ) + composer_form = Form(Message, view=action_forward["views"][0][0]) + composer_form.partner_ids.add(self.partner_forward) + composer = composer_form.save() + message_domain = [ + ("model", "=", self.test_record._name), + ("res_id", "=", self.test_record.id), + ] + with RecordCapturer(self.env["mail.message"], message_domain) as capture: + with self.mock_mail_gateway(): + composer._action_send_mail() + # Verify the followers of mail.message + forward_message = capture.records + self.assertEqual(len(forward_message.partner_ids), 1) + self.assertNotIn(self.partner_follower1, forward_message.partner_ids) + self.assertIn(self.partner_forward, forward_message.partner_ids) + self.assertIn("---------- Forwarded message ---------", forward_message.body) + + @users("user_test_forward") + def test_mail_forward_another_thread(self): + """ + Check that the email is forwarded to another thread. + and the email is sent to the followers of the another thread. + """ + ctx = { + "default_model": self.test_record._name, + "default_res_ids": [self.test_record.id], + } + composer_form = Form(self.env["mail.compose.message"].with_context(**ctx)) + composer_form.body = "

Hello

" + composer_form.subject = "Test Forward" + composer_form.partner_ids.add(self.partner_follower1) + composer = composer_form.save() + with self.mock_mail_gateway(): + composer._action_send_mail() + # Verify the followers of mail.message + message = self.test_record.message_ids[0] + self.assertEqual(len(message.partner_ids), 1) + self.assertIn(self.partner_follower1, message.partner_ids) + self.assertNotIn(self.partner_follower2, message.partner_ids) + self.assertNotIn(self.partner_forward, message.partner_ids) + self.assertNotIn("---------- Forwarded message ---------", message.body) + # Forward the email to another record(self.partner_forward) + action_forward = message.action_wizard_forward() + Message = self.env["mail.compose.message"].with_context( + **action_forward["context"] + ) + composer_form = Form(Message, view=action_forward["views"][0][0]) + composer_form.partner_ids.add(self.partner_follower2) + composer_form.forward_type = "another_thread" + composer_form.forward_thread = ( + f"{self.partner_forward._name},{self.partner_forward.id}" + ) + composer = composer_form.save() + message_domain = [ + ("model", "=", self.partner_forward._name), + ("res_id", "=", self.partner_forward.id), + ] + with RecordCapturer(self.env["mail.message"], message_domain) as capture: + with self.mock_mail_gateway(): + composer._action_send_mail() + # Verify the followers of mail.message + forward_message = capture.records + self.assertEqual(forward_message.subject, "Fwd: Test Forward") + self.assertEqual(len(forward_message.partner_ids), 1) + self.assertNotIn(self.partner_follower1, forward_message.partner_ids) + # the partner partner_follower2 is added to the message + # but is not added as a follower automatically. + self.assertIn(self.partner_follower2, forward_message.partner_ids) + self.assertNotIn( + self.partner_follower2, self.partner_forward.message_partner_ids + ) + self.assertIn("---------- Forwarded message ---------", forward_message.body) + + @users("user_test_forward") + def test_02_mail_forward_tour(self): + self.test_record.message_post( + body="Hello World", message_type="comment", subtype_xmlid="mail.mt_comment" + ) + self.start_tour( + "/web", "mail_forward.mail_forward_tour", login="user_test_forward" + ) + + @users("user_test_forward") + def test_03_mail_note_not_forward_tour(self): + self.test_record.message_post( + body="This is a note", message_type="comment", subtype_xmlid="mail.mt_note" + ) + self.start_tour( + "/web", "mail_forward.mail_note_not_forward_tour", login="user_test_forward" + ) diff --git a/mail_forward/views/ir_model_views.xml b/mail_forward/views/ir_model_views.xml new file mode 100644 index 000000000..5c93fbc06 --- /dev/null +++ b/mail_forward/views/ir_model_views.xml @@ -0,0 +1,17 @@ + + + + view.ir.model.form + ir.model + + + + + + + + diff --git a/mail_forward/wizards/__init__.py b/mail_forward/wizards/__init__.py new file mode 100644 index 000000000..b528d997d --- /dev/null +++ b/mail_forward/wizards/__init__.py @@ -0,0 +1 @@ +from . import mail_compose_message diff --git a/mail_forward/wizards/mail_compose_message.py b/mail_forward/wizards/mail_compose_message.py new file mode 100644 index 000000000..8b50e86c7 --- /dev/null +++ b/mail_forward/wizards/mail_compose_message.py @@ -0,0 +1,182 @@ +# Copyright 2024 Tecnativa - Carlos Lopez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import _, api, fields, models + + +class MailComposeMessage(models.TransientModel): + _inherit = "mail.compose.message" + + forward_type = fields.Selection( + [ + ("current_thread", "Current thread"), + ("another_thread", "Another thread"), + ], + default="current_thread", + ) + forward_thread = fields.Reference( + selection="_selection_forward_thread", string="Thread to forward" + ) + + @api.model + def _selection_forward_thread(self): + # Get all models available to be selected by the user. + # Only consider models that support posted messages and are not transient. + models = ( + self.env["ir.model"] + .sudo() + .search( + [ + ("transient", "=", False), + ("is_mail_thread", "=", True), + ("enable_forward_to", "=", True), + ], + order="name asc", + ) + ) + selection_values = [] + for model in models: + if ( + model.model in self.env and self.env[model.model]._auto + ): # No Abstract models or reports + selection_values.append((model.model, model.name)) + return selection_values + + @api.depends( + "composition_mode", + "model", + "res_domain", + "res_ids", + "template_id", + "forward_type", + ) + @api.depends_context("message_forwarded_id") + def _compute_attachment_ids(self): + # Save the attachments before calling super() to avoid losing them + # because when template_id is not set, + # attachment_ids is set to False in the super() call. + old_attachments = {composer.id: composer.attachment_ids for composer in self} + res = super()._compute_attachment_ids() + if self.env.context.get("message_forwarded_id"): + # Add the attachments from the original message. + message_forwarded = self.env["mail.message"].browse( + self.env.context["message_forwarded_id"] + ) + for composer in self: + composer.attachment_ids |= old_attachments[composer.id] + for attachment in message_forwarded.attachment_ids: + composer.attachment_ids |= attachment + return res + + @api.depends( + "composition_mode", + "model", + "res_domain", + "res_ids", + "template_id", + "forward_type", + "forward_thread", + ) + @api.depends_context("message_forwarded_id") + def _compute_body(self): + res = super()._compute_body() + if self.env.context.get("message_forwarded_id"): + # Set the body by default, taking it from the original message. + message_forwarded = self.env["mail.message"].browse( + self.env.context["message_forwarded_id"] + ) + for composer in self.filtered(lambda c: not c.body): + composer.body = message_forwarded._build_message_body_for_forward() + return res + + @api.depends( + "composition_mode", + "model", + "parent_id", + "record_name", + "res_domain", + "res_ids", + "template_id", + "forward_type", + "forward_thread", + ) + @api.depends_context("message_forwarded_id") + def _compute_subject(self): + res = super()._compute_subject() + if self.env.context.get("message_forwarded_id"): + # Set the subject by default, + # because when change the model and res_ids, + # the subject is taken from the new record. + message_forwarded = self.env["mail.message"].browse( + self.env.context["message_forwarded_id"] + ) + for composer in self: + composer.subject = f"{_('Fwd:')} {message_forwarded.subject}" + return res + + @api.depends("composition_mode", "parent_id", "forward_type", "forward_thread") + @api.depends_context("message_forwarded_id") + def _compute_model(self): + res = super()._compute_model() + if self.env.context.get("message_forwarded_id"): + # Set the model to the record to be forwarded + # if the composer is set to forward a record + # it sends the message to the record to be forwarded + for composer in self.filtered( + lambda c: c.forward_type == "another_thread" and c.forward_thread + ): + composer.model = composer.forward_thread._name + return res + + @api.depends("composition_mode", "parent_id", "forward_type", "forward_thread") + @api.depends_context("message_forwarded_id") + def _compute_res_ids(self): + res = super()._compute_res_ids() + if self.env.context.get("message_forwarded_id"): + # Set res_ids to the record to be forwarded + # if the composer is set to forward a record + # it sends the message to the record to be forwarded + for composer in self.filtered( + lambda c: c.forward_type == "another_thread" and c.forward_thread + ): + composer.res_ids = composer.forward_thread.ids + return res + + @api.depends( + "composition_mode", + "model", + "parent_id", + "res_domain", + "res_ids", + "template_id", + "forward_type", + ) + @api.depends_context("message_forwarded_id") + def _compute_partner_ids(self): + # Save the partner_ids before calling super() to avoid losing them + # because when template_id is not set, + # partner_ids is set to False in the super() call. + old_partners = {composer.id: composer.partner_ids for composer in self} + res = super()._compute_partner_ids() + if self.env.context.get("message_forwarded_id"): + # Add the attachments from the original message. + for composer in self: + composer.partner_ids |= old_partners[composer.id] + return res + + @api.model + def get_record_data(self, values): + result = super().get_record_data(values) + re_prefix = _("Re:") + fwd_prefix = _("Fwd:") + if self.env.context.get("message_forwarded_id"): + # remove 'Re: ' prefixes and add 'Fwd:' prefix to the subject + subject = result.get("subject") + if subject and subject.startswith(re_prefix): + subject = f"{fwd_prefix} {subject[4:]}" + result["subject"] = subject + return result + + def _action_send_mail(self, auto_commit=False): + return super( + MailComposeMessage, self.with_context(forward_type=self.forward_type) + )._action_send_mail(auto_commit=auto_commit) diff --git a/mail_forward/wizards/mail_compose_message_view.xml b/mail_forward/wizards/mail_compose_message_view.xml new file mode 100644 index 000000000..e1118b45d --- /dev/null +++ b/mail_forward/wizards/mail_compose_message_view.xml @@ -0,0 +1,41 @@ + + + + mail.compose.message.form.forward + mail.compose.message + primary + + + + + + + + + forward_type == 'current_thread' + + + Followers to notify + + + 1 + + + 1 + + + + diff --git a/mail_no_user_assign_notification/README.rst b/mail_no_user_assign_notification/README.rst new file mode 100644 index 000000000..6347a4fbe --- /dev/null +++ b/mail_no_user_assign_notification/README.rst @@ -0,0 +1,119 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +================================ +Mail No user Assign Notification +================================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2258ebf0f9828ca3d8384d904798cf7e1e4d0d9deb76aa232524103948b1c5de + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-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%2Fmail-lightgray.png?logo=github + :target: https://github.com/OCA/mail/tree/18.0/mail_no_user_assign_notification + :alt: OCA/mail +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/mail-18-0/mail-18-0-mail_no_user_assign_notification + :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/mail&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module inhibits the assignation notification from the models that +we want. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +1. Go to Settings > Technical > System Parameters +2. Edit "mailno_user_assign_notification.models" key record +3. Set any model\* (for example: res.partner). + +NOTE1: It is possible to set several models separated by comma (e.g.: +model1,model2). + +NOTE2: The model should have the field user_id for this to be effective. + +Usage +===== + +1. Go to one of the configured models (like Contacts). +2. Create or edit a record, and assign the field for the user (in + contacts, it's called "Salesperson", in purchase orders it's + "Purchase representative", etc). +3. The user won't receive the automatic assignment email. + +Known issues / Roadmap +====================== + +- This is not valid for project tasks users assignation, as the field is + multi-relational. A specific extension would be needed. + +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 +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +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. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/mail `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_no_user_assign_notification/__init__.py b/mail_no_user_assign_notification/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/mail_no_user_assign_notification/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mail_no_user_assign_notification/__manifest__.py b/mail_no_user_assign_notification/__manifest__.py new file mode 100644 index 000000000..08d922dc0 --- /dev/null +++ b/mail_no_user_assign_notification/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Mail No user Assign Notification", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/mail", + "version": "18.0.1.0.0", + "depends": ["mail"], + "license": "AGPL-3", + "category": "Discuss", + "data": ["data/ir_config_parameter.xml"], + "installable": True, + "maintainers": ["victoralmau"], +} diff --git a/mail_no_user_assign_notification/data/ir_config_parameter.xml b/mail_no_user_assign_notification/data/ir_config_parameter.xml new file mode 100644 index 000000000..d33db04f7 --- /dev/null +++ b/mail_no_user_assign_notification/data/ir_config_parameter.xml @@ -0,0 +1,7 @@ + + + + mail_no_user_assign_notification.models + + + diff --git a/mail_no_user_assign_notification/i18n/de.po b/mail_no_user_assign_notification/i18n/de.po new file mode 100644 index 000000000..c1003b38f --- /dev/null +++ b/mail_no_user_assign_notification/i18n/de.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_no_user_assign_notification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-02-17 13:09+0000\n" +"Last-Translator: MJD \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: mail_no_user_assign_notification +#: model:ir.model,name:mail_no_user_assign_notification.model_mail_thread +msgid "Email Thread" +msgstr "E-Mail-Thread" diff --git a/mail_no_user_assign_notification/i18n/es.po b/mail_no_user_assign_notification/i18n/es.po new file mode 100644 index 000000000..3fa5c046b --- /dev/null +++ b/mail_no_user_assign_notification/i18n/es.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_no_user_assign_notification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-30 15:32+0000\n" +"PO-Revision-Date: 2024-05-30 17:33+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 3.0.1\n" + +#. module: mail_no_user_assign_notification +#: model:ir.model,name:mail_no_user_assign_notification.model_mail_thread +msgid "Email Thread" +msgstr "Hilo de mensajes" diff --git a/mail_no_user_assign_notification/i18n/it.po b/mail_no_user_assign_notification/i18n/it.po new file mode 100644 index 000000000..18fa4e3e6 --- /dev/null +++ b/mail_no_user_assign_notification/i18n/it.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_no_user_assign_notification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-05 08:50+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.2\n" + +#. module: mail_no_user_assign_notification +#: model:ir.model,name:mail_no_user_assign_notification.model_mail_thread +msgid "Email Thread" +msgstr "Discussione e-mail" diff --git a/mail_no_user_assign_notification/i18n/mail_no_user_assign_notification.pot b/mail_no_user_assign_notification/i18n/mail_no_user_assign_notification.pot new file mode 100644 index 000000000..b7028132e --- /dev/null +++ b/mail_no_user_assign_notification/i18n/mail_no_user_assign_notification.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_no_user_assign_notification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: mail_no_user_assign_notification +#: model:ir.model,name:mail_no_user_assign_notification.model_mail_thread +msgid "Email Thread" +msgstr "" diff --git a/mail_no_user_assign_notification/models/__init__.py b/mail_no_user_assign_notification/models/__init__.py new file mode 100644 index 000000000..f2f13374b --- /dev/null +++ b/mail_no_user_assign_notification/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import mail_thread diff --git a/mail_no_user_assign_notification/models/mail_thread.py b/mail_no_user_assign_notification/models/mail_thread.py new file mode 100644 index 000000000..28b02c666 --- /dev/null +++ b/mail_no_user_assign_notification/models/mail_thread.py @@ -0,0 +1,24 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import models + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def _message_auto_subscribe_followers(self, updated_values, default_subtype_ids): + """Remove user_id from updated_values if this model has been set. + This will prevent the user from auto subscrube to records on creation and/or + assignment.""" + if updated_values.get("user_id"): + icp = self.sudo().env["ir.config_parameter"] + models_to_skip = icp.get_param( + "mail_no_user_assign_notification.models", "" + ) + models_to_skip = [x.strip() for x in models_to_skip.split(",")] + if self._name in models_to_skip: + updated_values.pop("user_id") + return super()._message_auto_subscribe_followers( + updated_values=updated_values, default_subtype_ids=default_subtype_ids + ) diff --git a/mail_no_user_assign_notification/pyproject.toml b/mail_no_user_assign_notification/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/mail_no_user_assign_notification/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/mail_no_user_assign_notification/readme/CONFIGURE.md b/mail_no_user_assign_notification/readme/CONFIGURE.md new file mode 100644 index 000000000..c18b02230 --- /dev/null +++ b/mail_no_user_assign_notification/readme/CONFIGURE.md @@ -0,0 +1,8 @@ +1. Go to Settings \> Technical \> System Parameters +2. Edit "mailno_user_assign_notification.models" key record +3. Set any model\* (for example: res.partner). + +NOTE1: It is possible to set several models separated by comma (e.g.: +model1,model2). + +NOTE2: The model should have the field user_id for this to be effective. diff --git a/mail_no_user_assign_notification/readme/CONTRIBUTORS.md b/mail_no_user_assign_notification/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5fee39042 --- /dev/null +++ b/mail_no_user_assign_notification/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/mail_no_user_assign_notification/readme/DESCRIPTION.md b/mail_no_user_assign_notification/readme/DESCRIPTION.md new file mode 100644 index 000000000..e94865168 --- /dev/null +++ b/mail_no_user_assign_notification/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module inhibits the assignation notification from the models that +we want. diff --git a/mail_no_user_assign_notification/readme/ROADMAP.md b/mail_no_user_assign_notification/readme/ROADMAP.md new file mode 100644 index 000000000..e880900b8 --- /dev/null +++ b/mail_no_user_assign_notification/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- This is not valid for project tasks users assignation, as the field is + multi-relational. A specific extension would be needed. diff --git a/mail_no_user_assign_notification/readme/USAGE.md b/mail_no_user_assign_notification/readme/USAGE.md new file mode 100644 index 000000000..72ca425c5 --- /dev/null +++ b/mail_no_user_assign_notification/readme/USAGE.md @@ -0,0 +1,5 @@ +1. Go to one of the configured models (like Contacts). +2. Create or edit a record, and assign the field for the user (in + contacts, it's called "Salesperson", in purchase orders it's + "Purchase representative", etc). +3. The user won't receive the automatic assignment email. diff --git a/mail_no_user_assign_notification/static/description/icon.png b/mail_no_user_assign_notification/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/mail_no_user_assign_notification/static/description/icon.png differ diff --git a/mail_no_user_assign_notification/static/description/index.html b/mail_no_user_assign_notification/static/description/index.html new file mode 100644 index 000000000..f909eb7ce --- /dev/null +++ b/mail_no_user_assign_notification/static/description/index.html @@ -0,0 +1,467 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Mail No user Assign Notification

+ +

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

+

This module inhibits the assignation notification from the models that +we want.

+

Table of contents

+ +
+

Configuration

+
    +
  1. Go to Settings > Technical > System Parameters
  2. +
  3. Edit “mailno_user_assign_notification.models” key record
  4. +
  5. Set any model* (for example: res.partner).
  6. +
+

NOTE1: It is possible to set several models separated by comma (e.g.: +model1,model2).

+

NOTE2: The model should have the field user_id for this to be effective.

+
+
+

Usage

+
    +
  1. Go to one of the configured models (like Contacts).
  2. +
  3. Create or edit a record, and assign the field for the user (in +contacts, it’s called “Salesperson”, in purchase orders it’s +“Purchase representative”, etc).
  4. +
  5. The user won’t receive the automatic assignment email.
  6. +
+
+
+

Known issues / Roadmap

+
    +
  • This is not valid for project tasks users assignation, as the field is +multi-relational. A specific extension would be needed.
  • +
+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Víctor Martínez
    • +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

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.

+

Current maintainer:

+

victoralmau

+

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

+

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

+
+
+
+
+ + diff --git a/mail_no_user_assign_notification/tests/__init__.py b/mail_no_user_assign_notification/tests/__init__.py new file mode 100644 index 000000000..5a63b7d7d --- /dev/null +++ b/mail_no_user_assign_notification/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_mail_no_user_assign_notification diff --git a/mail_no_user_assign_notification/tests/test_mail_no_user_assign_notification.py b/mail_no_user_assign_notification/tests/test_mail_no_user_assign_notification.py new file mode 100644 index 000000000..42b053471 --- /dev/null +++ b/mail_no_user_assign_notification/tests/test_mail_no_user_assign_notification.py @@ -0,0 +1,62 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + + +from odoo.tests import common, new_test_user + + +class TestMailNoUserAssignNotification(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user = new_test_user(cls.env, login="test_user") + cls.icp = cls.env.ref( + "mail_no_user_assign_notification.no_user_assign_notification_models" + ) + cls.icp.value = "res.partner" + # patch registry to simulate a ready environment + # so that _message_auto_subscribe_notify + # will be executed with the associated notification + cls.env.registry.ready = True + + def _get_mail_messages(self, record): + return self.env["mail.message"].search( + [("model", "=", record._name), ("res_id", "=", record.id)] + ) + + def test_partner_create(self): + partner = self.env["res.partner"].create( + { + "name": "Test partner", + "user_id": self.user.id, + } + ) + all_messages = self._get_mail_messages(partner) + # Message with user_notification is created when the assignment email is sent. + self.assertNotIn("user_notification", all_messages.mapped("message_type")) + # Remove model from config parameter (default behavior) + self.icp.value = "" + extra_partner = self.env["res.partner"].create( + { + "name": "Test partner extra", + "user_id": self.user.id, + } + ) + all_messages = self._get_mail_messages(extra_partner) + message = all_messages.filtered(lambda x: x.message_type == "user_notification") + self.assertIn("You have been assigned to", message.body) + + def test_partner_write(self): + partner = self.env["res.partner"].create({"name": "Test partner"}) + all_messages = self._get_mail_messages(partner) + partner.write({"user_id": self.user.id}) + new_messages = self._get_mail_messages(partner) - all_messages + # Message with user_notification is created when the assignment email is sent. + self.assertNotIn("user_notification", new_messages.mapped("message_type")) + # Remove model from config parameter (default behavior) + self.icp.value = "" + extra_partner = self.env["res.partner"].create({"name": "Test partner extra"}) + all_messages = self._get_mail_messages(extra_partner) + extra_partner.write({"user_id": self.user.id}) + new_messages = self._get_mail_messages(extra_partner) - all_messages + self.assertIn("You have been assigned to", new_messages.body) diff --git a/mail_post_defer/README.rst b/mail_post_defer/README.rst index 11a4beaac..8a2634703 100644 --- a/mail_post_defer/README.rst +++ b/mail_post_defer/README.rst @@ -11,7 +11,7 @@ Deferred Message Posting !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:b8388b0cb11cde1fb22cb0f1e2d686f10b048d834cf2b8fa29b3582c98b85853 + !! source digest: sha256:9e2d83f15087adaaf73a0d037632aa9b26388f81a23d8cf43836c5f8b19b0ba1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/mail_post_defer/__init__.py b/mail_post_defer/__init__.py index cc6b6354a..a0f653930 100644 --- a/mail_post_defer/__init__.py +++ b/mail_post_defer/__init__.py @@ -1,2 +1,3 @@ from . import models +from . import wizards from .hooks import post_init_hook diff --git a/mail_post_defer/__manifest__.py b/mail_post_defer/__manifest__.py index 58f8f238e..425f27940 100644 --- a/mail_post_defer/__manifest__.py +++ b/mail_post_defer/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Deferred Message Posting", "summary": "Faster and cancellable outgoing messages", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "development_status": "Alpha", "category": "Productivity/Discuss", "website": "https://github.com/OCA/mail", diff --git a/mail_post_defer/i18n/es.po b/mail_post_defer/i18n/es.po index 7b7e5b930..fe5c9bb50 100644 --- a/mail_post_defer/i18n/es.po +++ b/mail_post_defer/i18n/es.po @@ -19,7 +19,6 @@ msgstr "" #. module: mail_post_defer #. odoo-python #: code:addons/mail_post_defer/models/mail_thread.py:0 -#, python-format msgid "Cannot modify message; notifications were already sent." msgstr "No se puede modificar el mensaje; ya se han enviado notificaciones." @@ -28,11 +27,22 @@ msgstr "No se puede modificar el mensaje; ya se han enviado notificaciones." msgid "Email Thread" msgstr "Hilo de Correo Electrónico" +#. module: mail_post_defer +#: model:ir.model,name:mail_post_defer.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + #. module: mail_post_defer #: model:ir.model,name:mail_post_defer.model_mail_message msgid "Message" msgstr "Mensaje" +#. module: mail_post_defer +#. odoo-python +#: code:addons/mail_post_defer/models/mail_thread.py:0 +msgid "Only messages type comment can have their content updated" +msgstr "" + #. module: mail_post_defer #: model:ir.model,name:mail_post_defer.model_mail_message_schedule msgid "Scheduled Messages" diff --git a/mail_post_defer/i18n/it.po b/mail_post_defer/i18n/it.po index fbc405f5c..bae28ce57 100644 --- a/mail_post_defer/i18n/it.po +++ b/mail_post_defer/i18n/it.po @@ -19,7 +19,6 @@ msgstr "" #. module: mail_post_defer #. odoo-python #: code:addons/mail_post_defer/models/mail_thread.py:0 -#, python-format msgid "Cannot modify message; notifications were already sent." msgstr "" "Non si può modificare il messaggio; le notifiche sono già state spedite." @@ -29,11 +28,22 @@ msgstr "" msgid "Email Thread" msgstr "Discussione e-mail" +#. module: mail_post_defer +#: model:ir.model,name:mail_post_defer.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + #. module: mail_post_defer #: model:ir.model,name:mail_post_defer.model_mail_message msgid "Message" msgstr "Messaggio" +#. module: mail_post_defer +#. odoo-python +#: code:addons/mail_post_defer/models/mail_thread.py:0 +msgid "Only messages type comment can have their content updated" +msgstr "" + #. module: mail_post_defer #: model:ir.model,name:mail_post_defer.model_mail_message_schedule msgid "Scheduled Messages" diff --git a/mail_post_defer/i18n/mail_post_defer.pot b/mail_post_defer/i18n/mail_post_defer.pot index 0fe496c1d..7068819bc 100644 --- a/mail_post_defer/i18n/mail_post_defer.pot +++ b/mail_post_defer/i18n/mail_post_defer.pot @@ -24,6 +24,11 @@ msgstr "" msgid "Email Thread" msgstr "" +#. module: mail_post_defer +#: model:ir.model,name:mail_post_defer.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + #. module: mail_post_defer #: model:ir.model,name:mail_post_defer.model_mail_message msgid "Message" diff --git a/mail_post_defer/static/description/index.html b/mail_post_defer/static/description/index.html index 164f829ae..7d18ac3ea 100644 --- a/mail_post_defer/static/description/index.html +++ b/mail_post_defer/static/description/index.html @@ -372,7 +372,7 @@

Deferred Message Posting

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:b8388b0cb11cde1fb22cb0f1e2d686f10b048d834cf2b8fa29b3582c98b85853 +!! source digest: sha256:9e2d83f15087adaaf73a0d037632aa9b26388f81a23d8cf43836c5f8b19b0ba1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: LGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module enhances mail threads by using the mail queue by default.

diff --git a/mail_post_defer/tests/test_mail.py b/mail_post_defer/tests/test_mail.py index 02df51785..8d2b0fd69 100644 --- a/mail_post_defer/tests/test_mail.py +++ b/mail_post_defer/tests/test_mail.py @@ -272,6 +272,48 @@ def test_button_access(self): ) +@freezegun.freeze_time("2023-01-02 10:00:00") +class ComposerCase(MailPostDeferCommon): + """Test the composer wizard (HTML editor) behavior.""" + + def test_composer_html_deferred(self): + """Messages sent via HTML editor (composer) are deferred.""" + with self.mock_mail_gateway(): + composer = ( + self.env["mail.compose.message"] + .with_context( + default_composition_mode="comment", + default_model="res.partner", + default_res_ids=f"[{self.partner_portal.id}]", + ) + .create( + { + "subject": "Test Subject", + "body": "

HTML body content

", + "partner_ids": [(6, 0, self.partner_employee.ids)], + } + ) + ) + composer.action_send_mail() + schedules = self.env["mail.message.schedule"].search( + [ + ("mail_message_id.res_id", "=", self.partner_portal.id), + ("mail_message_id.model", "=", "res.partner"), + ("scheduled_datetime", "=", "2023-01-02 10:00:30"), + ] + ) + self.assertEqual(len(schedules), 1) + self.assertNoMail(self.partner_employee) + with freezegun.freeze_time("2023-01-02 10:01:00"): + self.env["mail.message.schedule"]._send_notifications_cron() + self.env["mail.mail"].process_email_queue() + self.assertSentEmail( + self.env.user.partner_id, + self.partner_employee, + body_content="HTML body content", + ) + + @tagged("-at_install", "post_install") @freezegun.freeze_time("2023-01-02 10:00:00") class AutomaticNotificationCase(MailPostDeferCommon): diff --git a/mail_post_defer/wizards/__init__.py b/mail_post_defer/wizards/__init__.py new file mode 100644 index 000000000..b528d997d --- /dev/null +++ b/mail_post_defer/wizards/__init__.py @@ -0,0 +1 @@ +from . import mail_compose_message diff --git a/mail_post_defer/wizards/mail_compose_message.py b/mail_post_defer/wizards/mail_compose_message.py new file mode 100644 index 000000000..ccf3c3431 --- /dev/null +++ b/mail_post_defer/wizards/mail_compose_message.py @@ -0,0 +1,19 @@ +# Copyright 2025 Moduon Team S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from datetime import timedelta + +from odoo import fields, models + + +class MailComposer(models.TransientModel): + _inherit = "mail.compose.message" + + def _prepare_mail_values_rendered(self, res_ids): + result = super()._prepare_mail_values_rendered(res_ids) + for res_id in res_ids: + if not result[res_id].get("scheduled_date"): + result[res_id]["scheduled_date"] = fields.Datetime.now() + timedelta( + seconds=30 + ) + return result diff --git a/mail_restrict_follower_selection/README.rst b/mail_restrict_follower_selection/README.rst index d5c9fb0d7..37ffb0653 100644 --- a/mail_restrict_follower_selection/README.rst +++ b/mail_restrict_follower_selection/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 + =========================== Restrict follower selection =========================== @@ -7,13 +11,13 @@ Restrict follower selection !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:449f3de313fb200f336c9351687009ffc0cd603dc47d5d0d4e2d315eb280ebf4 + !! source digest: sha256:976e9e65a681e7157cb433ca47a19013011496fa891bf180c564616589f0d470 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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%2Fmail-lightgray.png?logo=github @@ -52,9 +56,15 @@ certain record type (or have different restrictions for different record types), create a parameter mail_restrict_follower_selection.domain.$your_model. -As an example, you could use [('category_id.name', '=', 'Employees')] to -allow only contacts with 'Employees' tag to be added as follower - this -also is the default. +Some examples: + +- ``[("category_id.name", "=", "Employees")]`` : Only allow contacts + with 'Employees' tag +- ``[("is_company", "=", False)]`` : Restrict company contacts to be + added as follower (to avoid emails to info@ email address) +- ``[("user_ids","!=",False)]`` : Restrict to contacts with user + (internal and portal) +- ``[("employee_ids","!=",False)]`` : Restrict to employees Note: This module won't change existing followers! @@ -80,12 +90,12 @@ Authors Contributors ------------ -- Holger Brunn -- Nguyen Tan Phuc -- Enric Tobella -- `Quartile `__: +- Holger Brunn +- Nguyen Tan Phuc +- Enric Tobella +- `Quartile `__: - - Aung Ko Ko Lin + - Aung Ko Ko Lin Maintainers ----------- diff --git a/mail_restrict_follower_selection/__manifest__.py b/mail_restrict_follower_selection/__manifest__.py index 632722209..c31f31f6c 100644 --- a/mail_restrict_follower_selection/__manifest__.py +++ b/mail_restrict_follower_selection/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Restrict follower selection", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "author": "Therp BV,Creu Blanca,Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Social Network", diff --git a/mail_restrict_follower_selection/data/ir_config_parameter.xml b/mail_restrict_follower_selection/data/ir_config_parameter.xml index b44c26557..3b67980c2 100644 --- a/mail_restrict_follower_selection/data/ir_config_parameter.xml +++ b/mail_restrict_follower_selection/data/ir_config_parameter.xml @@ -2,6 +2,6 @@ mail_restrict_follower_selection.domain - [('category_id.name', '=', 'Employees')] + [] diff --git a/mail_restrict_follower_selection/i18n/de.po b/mail_restrict_follower_selection/i18n/de.po index eff22263f..8b93ddd07 100644 --- a/mail_restrict_follower_selection/i18n/de.po +++ b/mail_restrict_follower_selection/i18n/de.po @@ -6,15 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2018-12-15 14:58+0000\n" -"Last-Translator: Maria Sparenberg \n" +"PO-Revision-Date: 2026-02-17 10:10+0000\n" +"Last-Translator: MJD \n" "Language-Team: none\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.3\n" +"X-Generator: Weblate 5.15.2\n" #. module: mail_restrict_follower_selection #: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup @@ -29,7 +29,39 @@ msgstr "Abonnenten des Dokuments" #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread msgid "Email Thread" -msgstr "" +msgstr "E-Mail-Thread" + +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "Follower (Partner)" #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite diff --git a/mail_restrict_follower_selection/i18n/fr.po b/mail_restrict_follower_selection/i18n/fr.po index 7f96c92b0..a357edb97 100644 --- a/mail_restrict_follower_selection/i18n/fr.po +++ b/mail_restrict_follower_selection/i18n/fr.po @@ -34,6 +34,38 @@ msgstr "Suiveurs du document" msgid "Email Thread" msgstr "" +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite msgid "Invite wizard" diff --git a/mail_restrict_follower_selection/i18n/hr.po b/mail_restrict_follower_selection/i18n/hr.po index da0fd1828..fc8585f6b 100644 --- a/mail_restrict_follower_selection/i18n/hr.po +++ b/mail_restrict_follower_selection/i18n/hr.po @@ -34,6 +34,38 @@ msgstr "" msgid "Email Thread" msgstr "" +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite msgid "Invite wizard" diff --git a/mail_restrict_follower_selection/i18n/it.po b/mail_restrict_follower_selection/i18n/it.po index cf14c50f5..24838999e 100644 --- a/mail_restrict_follower_selection/i18n/it.po +++ b/mail_restrict_follower_selection/i18n/it.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-17 01:02+0000\n" -"PO-Revision-Date: 2025-02-20 11:07+0000\n" +"PO-Revision-Date: 2026-02-16 15:09+0000\n" "Last-Translator: mymage \n" "Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" "Language: it\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.15.2\n" #. module: mail_restrict_follower_selection #: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup @@ -34,6 +34,38 @@ msgstr "Follower Documento" msgid "Email Thread" msgstr "Discussione e-mail" +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite msgid "Invite wizard" diff --git a/mail_restrict_follower_selection/i18n/mail_restrict_follower_selection.pot b/mail_restrict_follower_selection/i18n/mail_restrict_follower_selection.pot index 38aaa874c..da8b60b9b 100644 --- a/mail_restrict_follower_selection/i18n/mail_restrict_follower_selection.pot +++ b/mail_restrict_follower_selection/i18n/mail_restrict_follower_selection.pot @@ -28,6 +28,38 @@ msgstr "" msgid "Email Thread" msgstr "" +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite msgid "Invite wizard" diff --git a/mail_restrict_follower_selection/i18n/sl.po b/mail_restrict_follower_selection/i18n/sl.po index 81102969c..78157127a 100644 --- a/mail_restrict_follower_selection/i18n/sl.po +++ b/mail_restrict_follower_selection/i18n/sl.po @@ -35,6 +35,38 @@ msgstr "" msgid "Email Thread" msgstr "" +#. module: mail_restrict_follower_selection +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_analytic_account__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_bank_statement_line__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_journal__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_move__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_payment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_reconcile_model__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_setup_bank_manual_config__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_account_tax__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_calendar_event__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_discuss_channel__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_cc__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_main_attachment__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread_phone__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_contact__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mailing_mailing__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_phone_blacklist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_category__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_pricelist__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_product__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_product_template__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_company__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_partner_bank__message_partner_ids +#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_res_users__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + #. module: mail_restrict_follower_selection #: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite msgid "Invite wizard" diff --git a/mail_restrict_follower_selection/models/mail_thread.py b/mail_restrict_follower_selection/models/mail_thread.py index 56af24527..c12f19b1b 100644 --- a/mail_restrict_follower_selection/models/mail_thread.py +++ b/mail_restrict_follower_selection/models/mail_thread.py @@ -1,4 +1,4 @@ -from odoo import models +from odoo import fields, models from odoo.tools import config from odoo.tools.safe_eval import safe_eval @@ -8,6 +8,12 @@ class MailThread(models.AbstractModel): _inherit = "mail.thread" + message_partner_ids = fields.Many2many( + domain=lambda thread: thread.env[ + "mail.wizard.invite" + ]._mail_restrict_follower_selection_get_domain(thread._name) + ) + def _message_add_suggested_recipient( self, result, partner=None, email=None, lang=None, reason="" ): diff --git a/mail_restrict_follower_selection/readme/CONFIGURE.md b/mail_restrict_follower_selection/readme/CONFIGURE.md index 9213b8be1..76836f613 100644 --- a/mail_restrict_follower_selection/readme/CONFIGURE.md +++ b/mail_restrict_follower_selection/readme/CONFIGURE.md @@ -5,8 +5,11 @@ certain record type (or have different restrictions for different record types), create a parameter mail_restrict_follower_selection.domain.\$your_model. -As an example, you could use \[('category_id.name', '=', 'Employees')\] -to allow only contacts with 'Employees' tag to be added as follower - -this also is the default. +Some examples: + +- `[("category_id.name", "=", "Employees")]` : Only allow contacts with 'Employees' tag +- `[("is_company", "=", False)]` : Restrict company contacts to be added as follower (to avoid emails to info@ email address) +- `[("user_ids","!=",False)]` : Restrict to contacts with user (internal and portal) +- `[("employee_ids","!=",False)]` : Restrict to employees Note: This module won't change existing followers! diff --git a/mail_restrict_follower_selection/static/description/index.html b/mail_restrict_follower_selection/static/description/index.html index 8d23fde53..e4d340ef2 100644 --- a/mail_restrict_follower_selection/static/description/index.html +++ b/mail_restrict_follower_selection/static/description/index.html @@ -3,7 +3,7 @@ -Restrict follower selection +README.rst -
-

Restrict follower selection

+
+ + +Odoo Community Association + +
+

Restrict follower selection

-

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

+

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

This module was written to allow you to restrict the selection of possible followers. For example, if you use the social ERP functions only internally, it makes sense to filter possible followers for being @@ -391,20 +396,27 @@

Restrict follower selection

-

Configuration

+

Configuration

To configure this module, you need to go to System parameters and adjust mail_restrict_follower_selection.domain as you see fit. This restricts followers globally, if you want to restrict only the followers for a certain record type (or have different restrictions for different record types), create a parameter mail_restrict_follower_selection.domain.$your_model.

-

As an example, you could use [(‘category_id.name’, ‘=’, ‘Employees’)] to -allow only contacts with ‘Employees’ tag to be added as follower - this -also is the default.

+

Some examples:

+
    +
  • [("category_id.name", "=", "Employees")] : Only allow contacts +with ‘Employees’ tag
  • +
  • [("is_company", "=", False)] : Restrict company contacts to be +added as follower (to avoid emails to info@ email address)
  • +
  • [("user_ids","!=",False)] : Restrict to contacts with user +(internal and portal)
  • +
  • [("employee_ids","!=",False)] : Restrict to employees
  • +

Note: This module won’t change existing followers!

-

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 @@ -412,16 +424,16 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Therp BV
  • Creu Blanca
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -446,5 +458,6 @@

Maintainers

+
diff --git a/mail_tracking/i18n/tr.po b/mail_tracking/i18n/tr.po index 05d2a6bb2..86479499f 100644 --- a/mail_tracking/i18n/tr.po +++ b/mail_tracking/i18n/tr.po @@ -9,14 +9,15 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-22 00:51+0000\n" -"PO-Revision-Date: 2017-07-22 00:51+0000\n" -"Last-Translator: OCA Transbot , 2016\n" +"PO-Revision-Date: 2026-02-13 12:09+0000\n" +"Last-Translator: Betül Öğmen \n" "Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Weblate 5.15.2\n" #. module: mail_tracking #: model:ir.model.fields,help:mail_tracking.field_mail_tracking_email__state @@ -45,39 +46,39 @@ msgstr "" #. module: mail_tracking #: model:ir.model.fields,help:mail_tracking.field_mail_message__email_cc msgid "Additional recipients that receive a \"Carbon Copy\" of the e-mail" -msgstr "" +msgstr "E-postanın \"Karbon Kopyası\"nı alan ek alıcılar" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_thread.py:0 msgid "Anon. To" -msgstr "" +msgstr "Anonim. Kime" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Anonymous Recipient" -msgstr "" +msgstr "Anonim Alıcı" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Bounce" -msgstr "" +msgstr "Atla" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__bounce_description msgid "Bounce Description" -msgstr "" +msgstr "Atlama Açıklaması" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__bounce_type msgid "Bounce Type" -msgstr "" +msgstr "Atlama Tipi" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__bounced msgid "Bounced" -msgstr "" +msgstr "Geri Döndü" #. module: mail_tracking #. odoo-javascript @@ -91,32 +92,32 @@ msgstr "" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Click" -msgstr "" +msgstr "Tıkla" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__click msgid "Clicked" -msgstr "" +msgstr "Tıklandı" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__url msgid "Clicked URL" -msgstr "" +msgstr "Tıklanan URL" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_res_company msgid "Companies" -msgstr "" +msgstr "Şirketler" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_res_config_settings msgid "Config Settings" -msgstr "" +msgstr "Yapılandırma Ayarları" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_res_partner msgid "Contact" -msgstr "" +msgstr "Kontak" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_form @@ -148,13 +149,13 @@ msgstr "Tarih" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__deferral msgid "Deferral" -msgstr "" +msgstr "Erteleme" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__deferred #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search msgid "Deferred" -msgstr "" +msgstr "Ertelendi" #. module: mail_tracking #. odoo-python @@ -164,25 +165,25 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Delivered" -msgstr "" +msgstr "Teslim Edildi" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Delivered Status Center Checkmark" -msgstr "" +msgstr "Teslim Edildi Durumu Merkez Tik" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Delivered Status Left Checkmark" -msgstr "" +msgstr "Teslim Edildi Durumu Sol Tik" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Delivered Status Right Checkmark" -msgstr "" +msgstr "Teslim Edildi Durumu Sağ Tik" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__display_name @@ -199,43 +200,40 @@ msgstr "Eposta" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_alias msgid "Email Aliases" -msgstr "" +msgstr "E-posta Rumuzları" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_bounced_mixin__email_bounced #: model:ir.model.fields,field_description:mail_tracking.field_res_partner__email_bounced #: model:ir.model.fields,field_description:mail_tracking.field_res_users__email_bounced msgid "Email Bounced" -msgstr "" +msgstr "E-posta Geri Döndü" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_alias_domain msgid "Email Domain" -msgstr "" +msgstr "E-posta Alan Adı" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_res_partner__email_score #: model:ir.model.fields,field_description:mail_tracking.field_res_users__email_score -#, fuzzy msgid "Email Score" -msgstr "Eposta" +msgstr "E-posta Skoru" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_thread -#, fuzzy msgid "Email Thread" -msgstr "Eposta" +msgstr "E-posta Konusu" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_res_partner_filter msgid "Email bounced" -msgstr "" +msgstr "E-posta geri döndü" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_resend_message -#, fuzzy msgid "Email resend wizard" -msgstr "Eposta" +msgstr "E-posta tekrar iletme sihirbazı" #. module: mail_tracking #. odoo-python @@ -249,34 +247,34 @@ msgstr "Hata" #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__error_description #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__error_description msgid "Error Description" -msgstr "" +msgstr "Hata Açıklaması" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__error_details msgid "Error Details" -msgstr "" +msgstr "Hata Detayları" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__error_smtp_server msgid "Error SMTP server" -msgstr "" +msgstr "Hata SMTP sunucusu" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Error Status" -msgstr "" +msgstr "Hata Durumu" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__error_type #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__error_type msgid "Error Type" -msgstr "" +msgstr "Hata Türü" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__event_type msgid "Event Type" -msgstr "" +msgstr "Etkinlik Türü" #. module: mail_tracking #. odoo-javascript @@ -285,7 +283,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Failed" -msgstr "" +msgstr "Başarısız" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_account_account__failed_message_ids @@ -316,40 +314,39 @@ msgstr "" #: model:ir.model.fields,field_description:mail_tracking.field_res_partner__failed_message_ids #: model:ir.model.fields,field_description:mail_tracking.field_res_partner_bank__failed_message_ids #: model:ir.model.fields,field_description:mail_tracking.field_res_users__failed_message_ids -#, fuzzy msgid "Failed Messages" -msgstr "İleti" +msgstr "Başarısız Mesajlar" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message/failed_message.xml:0 #: code:addons/mail_tracking/static/src/core/message/message.xml:0 msgid "Failed Recipients:" -msgstr "" +msgstr "Başarısız Alıcılar:" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/core/chatter/chatter.xml:0 msgid "Failed messages" -msgstr "" +msgstr "Başarısız iletiler" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_thread.py:0 msgid "Failed sent messages" -msgstr "" +msgstr "Mesajları göndermek başarısız oldu" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message/failed_message.xml:0 msgid "Go" -msgstr "" +msgstr "Git" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message/failed_message.xml:0 msgid "Go to message" -msgstr "" +msgstr "Mesaja git" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search @@ -360,7 +357,7 @@ msgstr "Grupla" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__hard_bounce msgid "Hard bounce" -msgstr "" +msgstr "Zorla atla" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__id @@ -380,23 +377,25 @@ msgid "" "If set as positive integer enables the deletion of old mail tracking records " "to reduce the database size." msgstr "" +"Pozitif bir tamsayı olarak ayarlanırsa, veritabanı boyutunu küçültmek için " +"eski posta takip kayıtlarının silinmesini sağlar." #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message/failed_message.xml:0 msgid "Info" -msgstr "" +msgstr "Bilgi" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_mail__is_failed_message #: model:ir.model.fields,field_description:mail_tracking.field_mail_message__is_failed_message msgid "Is Failed Message" -msgstr "" +msgstr "Başarısız Olan Mesaj" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__mobile msgid "Is mobile?" -msgstr "" +msgstr "Devingen mi?" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__write_uid @@ -413,68 +412,67 @@ msgstr "Son güncelleme" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__mail_message_id msgid "Mail Message" -msgstr "" +msgstr "E-posta Mesajı" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_ir_mail_server -#, fuzzy msgid "Mail Server" -msgstr "Eposta" +msgstr "E-posta Sunucusu" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_mail__mail_tracking_needs_action #: model:ir.model.fields,field_description:mail_tracking.field_mail_message__mail_tracking_needs_action msgid "Mail Tracking Needs Action" -msgstr "" +msgstr "E-Posta Takibi Eylem Gerektiriyor" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_mail__mail_tracking_ids #: model:ir.model.fields,field_description:mail_tracking.field_mail_message__mail_tracking_ids msgid "Mail Trackings" -msgstr "" +msgstr "E-Posta Takipleri" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_bounced_mixin msgid "Mail bounced mixin" -msgstr "" +msgstr "E-Posta geri döndü birleşim" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_tracking_email msgid "MailTracking email" -msgstr "" +msgstr "E-Posta Takibi eposta" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search msgid "MailTracking email search" -msgstr "" +msgstr "E-Posta Takibi eposta arama" #. module: mail_tracking #: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email msgid "MailTracking emails" -msgstr "" +msgstr "E-Posta Takibi epostalar" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_tracking_event #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_form #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_form msgid "MailTracking event" -msgstr "" +msgstr "E-Posta Takibi etkinlik" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "MailTracking event search" -msgstr "" +msgstr "E-Posta Takibi etkinlik arama" #. module: mail_tracking #: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event msgid "MailTracking events" -msgstr "" +msgstr "E-Posta Takibi etkinlikler" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_res_config_settings__mail_tracking_email_max_age_days #: model_terms:ir.ui.view,arch_db:mail_tracking.res_config_settings_view_form msgid "Max age in days of mail tracking email records" -msgstr "" +msgstr "Posta takibi e-posta kayıtlarının maksimum yaşı (gün olarak)" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_message @@ -496,48 +494,48 @@ msgstr "Ay" #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_tree msgid "OS" -msgstr "" +msgstr "İşletim Sistemi" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__open #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Open" -msgstr "" +msgstr "Açık" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_message.py:0 #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__opened msgid "Opened" -msgstr "" +msgstr "Açıldı" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Opened Status Center Checkmark" -msgstr "" +msgstr "Açıldı Durumu Merkez Tik" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Opened Status Left Checkmark" -msgstr "" +msgstr "Açıldı Durumu Sol Tik" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Opened Status Right Checkmark" -msgstr "" +msgstr "Açıldı Durumu Sağ Tik" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__os_family msgid "Operating system family" -msgstr "" +msgstr "İşletim sistemi ailesi" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_mail_mail msgid "Outgoing Mails" -msgstr "" +msgstr "Giden Postalar" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__partner_id @@ -547,63 +545,63 @@ msgstr "İş Ortağı" #. module: mail_tracking #: model:ir.model.fields,help:mail_tracking.field_mail_message__email_to msgid "Raw TO recipients" -msgstr "" +msgstr "Ham TO alıcıları" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__recipient #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_tree #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Recipient" -msgstr "" +msgstr "Alıcı" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search msgid "Recipient Address" -msgstr "" +msgstr "Alıcı Adresi" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__recipient msgid "Recipient email" -msgstr "" +msgstr "Alıcı e-postası" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__recipient_address #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__recipient_address msgid "Recipient email address" -msgstr "" +msgstr "Alıcı e-posta adresi" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__rejected #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__reject msgid "Rejected" -msgstr "" +msgstr "Reddedildi" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message_review/failed_message_review.xml:0 msgid "Retry" -msgstr "" +msgstr "Yeniden Dene" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__smtp_server msgid "SMTP server" -msgstr "" +msgstr "SMTP sunucusu" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__token msgid "Security Token" -msgstr "" +msgstr "Güvenlik Jetonu" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_tree msgid "Sender" -msgstr "" +msgstr "Gönderen" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__sender msgid "Sender email" -msgstr "" +msgstr "Gönderen e-postası" #. module: mail_tracking #. odoo-python @@ -619,36 +617,36 @@ msgstr "Gönderildi" #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Sent Status" -msgstr "" +msgstr "Gönderildi Durumu" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message_review/failed_message_review.xml:0 msgid "Set As Reviewed" -msgstr "" +msgstr "İncelendi Olarak Ayarla" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message_review/failed_message_review.xml:0 msgid "Set as Reviewed" -msgstr "" +msgstr "İncelendi olarak Ayarla" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_res_company__mail_tracking_show_aliases #: model:ir.model.fields,field_description:mail_tracking.field_res_config_settings__mail_tracking_show_aliases #: model_terms:ir.ui.view,arch_db:mail_tracking.res_config_settings_view_form msgid "Show Aliases in Mail Tracking" -msgstr "" +msgstr "Posta Takibinde Takma Adları Göster" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__soft_bounce msgid "Soft bounce" -msgstr "" +msgstr "Geçici geri dönüş" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__soft-bounced msgid "Soft bounced" -msgstr "" +msgstr "Geçici geri döndü" #. module: mail_tracking #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_email__state__spam @@ -666,7 +664,7 @@ msgstr "Durum" #. odoo-python #: code:addons/mail_tracking/models/mail_message.py:0 msgid "Status: %s" -msgstr "" +msgstr "Durum: %s" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__name @@ -678,19 +676,19 @@ msgstr "Konu" #. odoo-javascript #: code:addons/mail_tracking/static/src/components/failed_message/failed_message.xml:0 msgid "Subject:" -msgstr "" +msgstr "Konu:" #. module: mail_tracking #: model:ir.model.fields,help:mail_tracking.field_mail_mail__mail_tracking_needs_action #: model:ir.model.fields,help:mail_tracking.field_mail_message__mail_tracking_needs_action msgid "The message tracking will be considered to filter tracking issues" -msgstr "" +msgstr "İleti takibi, takip sorunlarını filtrelemek için dikkate alınacaktır" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_message.py:0 msgid "The partner doesn't have a defined email" -msgstr "" +msgstr "Ortak tanımlı bir e-postaya sahip değil" #. module: mail_tracking #. odoo-python @@ -703,6 +701,12 @@ msgid "" "\n" "Records: %(records)s, User: %(user)s" msgstr "" +"İstenen işlem, güvenlik kısıtlamaları nedeniyle tamamlanamıyor. Lütfen " +"sistem yöneticinize başvurun.\n" +"\n" +"(Belge türü: %(desc)s, İşlem: %(operation)s)\n" +"\n" +"Kayıtlar: %(records)s, Kullanıcı: %(user)s" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__time @@ -710,36 +714,36 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "Time" -msgstr "" +msgstr "Zaman" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_message__email_to msgid "To" -msgstr "" +msgstr "Alıcı" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/core/message/message.xml:0 msgid "To:" -msgstr "" +msgstr "Alıcı:" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_res_partner__tracking_emails_count #: model:ir.model.fields,field_description:mail_tracking.field_res_users__tracking_emails_count msgid "Tracking Emails Count" -msgstr "" +msgstr "Takip E-postaları Sayısı" #. module: mail_tracking #: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email #: model_terms:ir.ui.view,arch_db:mail_tracking.view_partner_form msgid "Tracking emails" -msgstr "" +msgstr "Takip e-postaları" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__tracking_event_ids #: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event msgid "Tracking events" -msgstr "" +msgstr "Takip etkinlikleri" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search @@ -755,19 +759,19 @@ msgstr "" #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_email__timestamp #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__timestamp msgid "UTC timestamp" -msgstr "" +msgstr "UTC zaman damgası" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_message.py:0 msgid "Unknown" -msgstr "" +msgstr "Bilinmeyen" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Unknown Status" -msgstr "" +msgstr "Bilinmeyen Durum" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search @@ -779,57 +783,57 @@ msgstr "Takibi bırak" #: model:ir.model.fields.selection,name:mail_tracking.selection__mail_tracking_event__event_type__unsub #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_search msgid "Unsubscribed" -msgstr "" +msgstr "Takibi bırak" #. module: mail_tracking #: model:ir.model,name:mail_tracking.model_res_users msgid "User" -msgstr "" +msgstr "Kullanıcı" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__user_agent msgid "User Agent" -msgstr "" +msgstr "Kullanıcı Aracısı" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__ip msgid "User IP" -msgstr "" +msgstr "Kullanıcı IP" #. module: mail_tracking #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_email_form #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_tree msgid "User agent" -msgstr "" +msgstr "Kullanıcı aracısı" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__ua_family msgid "User agent family" -msgstr "" +msgstr "Kullanıcı aracısı ailesi" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__ua_type #: model_terms:ir.ui.view,arch_db:mail_tracking.view_mail_tracking_event_search msgid "User agent type" -msgstr "" +msgstr "Kullanıcı aracısı türü" #. module: mail_tracking #: model:ir.model.fields,field_description:mail_tracking.field_mail_tracking_event__user_country_id msgid "User country" -msgstr "" +msgstr "Kullanıcı ülkesi" #. module: mail_tracking #. odoo-python #: code:addons/mail_tracking/models/mail_message.py:0 msgid "Waiting" -msgstr "" +msgstr "Beklemede" #. module: mail_tracking #. odoo-javascript #: code:addons/mail_tracking/static/src/components/message_tracking/message_tracking_status.xml:0 msgid "Waiting Status" -msgstr "" +msgstr "Bekleme Durumu" #~ msgid "Last Modified on" #~ msgstr "Son değişiklik" diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 0f98b4601..df8afc237 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-mail" -version = "18.0.20260113.0" +version = "18.0.20260212.1" dependencies = [ "odoo-addon-base_search_mail_content==18.0.*", "odoo-addon-mail_activity_board==18.0.*", @@ -17,9 +17,11 @@ dependencies = [ "odoo-addon-mail_drop_target==18.0.*", "odoo-addon-mail_extra_header==18.0.*", "odoo-addon-mail_force_email_notification==18.0.*", + "odoo-addon-mail_forward==18.0.*", "odoo-addon-mail_inline_css==18.0.*", "odoo-addon-mail_layout_preview==18.0.*", "odoo-addon-mail_message_search==18.0.*", + "odoo-addon-mail_no_user_assign_notification==18.0.*", "odoo-addon-mail_notification_clean_status_error==18.0.*", "odoo-addon-mail_notification_custom_subject==18.0.*", "odoo-addon-mail_optional_autofollow==18.0.*",