From 54e4405143ca1287feb1faca878dcddfd769a907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Todorovich?= Date: Mon, 15 Jul 2019 14:45:41 +0000 Subject: [PATCH 1/4] ADD mail_template_conditional_attachment --- .../README.rst | 77 ++++ .../__init__.py | 1 + .../__manifest__.py | 25 + .../demo/mail_template.xml | 4 + .../models/__init__.py | 2 + .../models/mail_template.py | 35 ++ .../mail_template_conditional_attachment.py | 57 +++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../readme/USAGE.rst | 7 + .../security/ir.model.access.csv | 2 + .../static/description/index.html | 428 ++++++++++++++++++ .../views/mail_template.xml | 38 ++ .../wizards/__init__.py | 1 + 14 files changed, 679 insertions(+) create mode 100644 mail_template_conditional_attachment/README.rst create mode 100644 mail_template_conditional_attachment/__init__.py create mode 100644 mail_template_conditional_attachment/__manifest__.py create mode 100644 mail_template_conditional_attachment/demo/mail_template.xml create mode 100644 mail_template_conditional_attachment/models/__init__.py create mode 100644 mail_template_conditional_attachment/models/mail_template.py create mode 100644 mail_template_conditional_attachment/models/mail_template_conditional_attachment.py create mode 100644 mail_template_conditional_attachment/readme/CONTRIBUTORS.rst create mode 100644 mail_template_conditional_attachment/readme/DESCRIPTION.rst create mode 100644 mail_template_conditional_attachment/readme/USAGE.rst create mode 100644 mail_template_conditional_attachment/security/ir.model.access.csv create mode 100644 mail_template_conditional_attachment/static/description/index.html create mode 100644 mail_template_conditional_attachment/views/mail_template.xml create mode 100644 mail_template_conditional_attachment/wizards/__init__.py diff --git a/mail_template_conditional_attachment/README.rst b/mail_template_conditional_attachment/README.rst new file mode 100644 index 000000000..eb72ef741 --- /dev/null +++ b/mail_template_conditional_attachment/README.rst @@ -0,0 +1,77 @@ +===================================== +Email Template Conditional Attachment +===================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-druidoo%2Fdruidoo--addons-lightgray.png?logo=github + :target: https://github.com/druidoo/druidoo-addons/tree/12.0/mail_template_conditional_attachment + :alt: druidoo/druidoo-addons + +|badge1| |badge2| |badge3| + +Allows to add conditional attachments to email templates. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use conditional attachments, you need to: + +1. Go to the corresponding Email Template record. +2. You should see the Conditional Attachments under Advance Settings +3. Create a new conditional attachment, and select the domain condition. + +You can attach multiple files under the same condition. + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* La Louve +* Druidoo + +Contributors +~~~~~~~~~~~~ + +* Iván Todorovich (https://www.druidoo.io) + +Maintainers +~~~~~~~~~~~ + +.. |maintainer-ivantodorovich| image:: https://github.com/ivantodorovich.png?size=40px + :target: https://github.com/ivantodorovich + :alt: ivantodorovich + +Current maintainer: + +|maintainer-ivantodorovich| + +This module is part of the `druidoo/druidoo-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/mail_template_conditional_attachment/__init__.py b/mail_template_conditional_attachment/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/mail_template_conditional_attachment/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mail_template_conditional_attachment/__manifest__.py b/mail_template_conditional_attachment/__manifest__.py new file mode 100644 index 000000000..8984a9d5a --- /dev/null +++ b/mail_template_conditional_attachment/__manifest__.py @@ -0,0 +1,25 @@ +# Copyright 2016 La Louve +# Copyright 2019 Druidoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Email Template Conditional Attachment", + "summary": "Allow to add conditional attachments to email templates", + "version": "12.0.1.0.0", + "category": "Uncategorized", + "website": "https://github.com/druidoo/druidoo-addons", + "author": "La Louve, Druidoo, Odoo Community Association (OCA)", + "maintainers": [ + "ivantodorovich" + ], + "license": "AGPL-3", + "depends": [ + "mail", + ], + "data": [ + "views/mail_template.xml", + "security/ir.model.access.csv", + ], + "demo": [ + "demo/mail_template.xml", + ], +} diff --git a/mail_template_conditional_attachment/demo/mail_template.xml b/mail_template_conditional_attachment/demo/mail_template.xml new file mode 100644 index 000000000..1d77a6b31 --- /dev/null +++ b/mail_template_conditional_attachment/demo/mail_template.xml @@ -0,0 +1,4 @@ + + + + diff --git a/mail_template_conditional_attachment/models/__init__.py b/mail_template_conditional_attachment/models/__init__.py new file mode 100644 index 000000000..277ff4f78 --- /dev/null +++ b/mail_template_conditional_attachment/models/__init__.py @@ -0,0 +1,2 @@ +from . import mail_template +from . import mail_template_conditional_attachment diff --git a/mail_template_conditional_attachment/models/mail_template.py b/mail_template_conditional_attachment/models/mail_template.py new file mode 100644 index 000000000..2215d516e --- /dev/null +++ b/mail_template_conditional_attachment/models/mail_template.py @@ -0,0 +1,35 @@ +from odoo import api, models, fields +from odoo.tools import pycompat + + +class MailTemplate(models.Model): + _inherit = 'mail.template' + + conditional_attachment_ids = fields.One2many( + 'mail.template.conditional.attachment', + 'mail_template_id', + string='Conditional Attachments', + ) + + @api.multi + def generate_email(self, res_ids, **kwargs): + """ Overload this method to attach conditional attachments """ + self.ensure_one() + + # Odoo way of handling different result for multi/one res_ids + # Placed before super(), so we force multi_mode=True there + multi_mode = True + if isinstance(res_ids, pycompat.integer_types): + res_ids = [res_ids] + multi_mode = False + + results = super().generate_email(res_ids, **kwargs) + + # Add conditional attachments + if self.conditional_attachment_ids: + for res_id in res_ids: + attachment_ids = \ + self.conditional_attachment_ids.get_attachment_ids(res_id) + results[res_id]['attachment_ids'] = attachment_ids.ids + + return multi_mode and results or results[res_ids[0]] diff --git a/mail_template_conditional_attachment/models/mail_template_conditional_attachment.py b/mail_template_conditional_attachment/models/mail_template_conditional_attachment.py new file mode 100644 index 000000000..14c8063ec --- /dev/null +++ b/mail_template_conditional_attachment/models/mail_template_conditional_attachment.py @@ -0,0 +1,57 @@ +from odoo import api, models, fields +from odoo.tools import safe_eval +import datetime +import time +import dateutil + + +class MailTemplateConditionalAttachment(models.Model): + _name = 'mail.template.conditional.attachment' + _description = 'Mail Template Conditional Attachment' + + name = fields.Char('Description', required=True) + + mail_template_id = fields.Many2one( + 'mail.template', + ondelete='cascade', + required=True, + index=True, + ) + + attachment_ids = fields.Many2many( + 'ir.attachment', + string='Attachments', + ) + + model_name = fields.Char(related='mail_template_id.model_id.model') + + filter_domain = fields.Char( + 'Apply on', + help='If present, this condition must be satisfied ' + 'to include the attachments.', + ) + + def _get_eval_context(self): + return { + 'datetime': datetime, + 'dateutil': dateutil, + 'time': time, + 'uid': self.env.uid, + 'user': self.env.user, + } + + def _check_condition(self, res_id): + self.ensure_one() + if self.filter_domain: + domain = [('id', '=', res_id)] + domain += safe_eval(self.filter_domain, self._get_eval_context()) + model = self.env[self.model_name] + return bool(model.search_count(domain)) + else: + return True + + @api.multi + def get_attachment_ids(self, res_id): + self.mapped('mail_template_id').ensure_one() + return self.filtered( + lambda r: r._check_condition(res_id)).mapped('attachment_ids') diff --git a/mail_template_conditional_attachment/readme/CONTRIBUTORS.rst b/mail_template_conditional_attachment/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..55f90e6b6 --- /dev/null +++ b/mail_template_conditional_attachment/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Iván Todorovich (https://www.druidoo.io) diff --git a/mail_template_conditional_attachment/readme/DESCRIPTION.rst b/mail_template_conditional_attachment/readme/DESCRIPTION.rst new file mode 100644 index 000000000..253440fdc --- /dev/null +++ b/mail_template_conditional_attachment/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Allows to add conditional attachments to email templates. diff --git a/mail_template_conditional_attachment/readme/USAGE.rst b/mail_template_conditional_attachment/readme/USAGE.rst new file mode 100644 index 000000000..c58bee9bc --- /dev/null +++ b/mail_template_conditional_attachment/readme/USAGE.rst @@ -0,0 +1,7 @@ +To use conditional attachments, you need to: + +1. Go to the corresponding Email Template record. +2. You should see the Conditional Attachments under Advance Settings +3. Create a new conditional attachment, and select the domain condition. + +You can attach multiple files under the same condition. diff --git a/mail_template_conditional_attachment/security/ir.model.access.csv b/mail_template_conditional_attachment/security/ir.model.access.csv new file mode 100644 index 000000000..bc1a8e982 --- /dev/null +++ b/mail_template_conditional_attachment/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_mail_template_conditional_attachment_user,mail.template.conditional.attachment.user,model_mail_template_conditional_attachment,base.group_user,1,1,1,1 diff --git a/mail_template_conditional_attachment/static/description/index.html b/mail_template_conditional_attachment/static/description/index.html new file mode 100644 index 000000000..ec53c7ebd --- /dev/null +++ b/mail_template_conditional_attachment/static/description/index.html @@ -0,0 +1,428 @@ + + + + + + +Email Template Conditional Attachment + + + +
+

Email Template Conditional Attachment

+ + +

Beta License: AGPL-3 druidoo/druidoo-addons

+

Allows to add conditional attachments to email templates.

+

Table of contents

+ +
+

Usage

+

To use conditional attachments, you need to:

+
    +
  1. Go to the corresponding Email Template record.
  2. +
  3. You should see the Conditional Attachments under Advance Settings
  4. +
  5. Create a new conditional attachment, and select the domain condition.
  6. +
+

You can attach multiple files under the same condition.

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • La Louve
  • +
  • Druidoo
  • +
+
+ +
+

Maintainers

+

Current maintainer:

+

ivantodorovich

+

This module is part of the druidoo/druidoo-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/mail_template_conditional_attachment/views/mail_template.xml b/mail_template_conditional_attachment/views/mail_template.xml new file mode 100644 index 000000000..d9e57f7aa --- /dev/null +++ b/mail_template_conditional_attachment/views/mail_template.xml @@ -0,0 +1,38 @@ + + + + + mail.template + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+
+
+
+
+
+
+ +
diff --git a/mail_template_conditional_attachment/wizards/__init__.py b/mail_template_conditional_attachment/wizards/__init__.py new file mode 100644 index 000000000..b528d997d --- /dev/null +++ b/mail_template_conditional_attachment/wizards/__init__.py @@ -0,0 +1 @@ +from . import mail_compose_message From ebf1083ec3fa829f4c806ff50def851282577e2e Mon Sep 17 00:00:00 2001 From: druidoo-transbot Date: Mon, 15 Jul 2019 15:20:19 +0000 Subject: [PATCH 2/4] [UPD] Update mail_template_conditional_attachment.pot [IMP] Readmes [ADD] icon.png Remove OCA icons [ADD] icon.png --- .../mail_template_conditional_attachment.pot | 97 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9673 bytes .../static/description/index.html | 2 +- .../views/mail_template.xml | 2 +- 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 mail_template_conditional_attachment/i18n/mail_template_conditional_attachment.pot create mode 100644 mail_template_conditional_attachment/static/description/icon.png diff --git a/mail_template_conditional_attachment/i18n/mail_template_conditional_attachment.pot b/mail_template_conditional_attachment/i18n/mail_template_conditional_attachment.pot new file mode 100644 index 000000000..b18038a6f --- /dev/null +++ b/mail_template_conditional_attachment/i18n/mail_template_conditional_attachment.pot @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_template_conditional_attachment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__filter_domain +msgid "Apply on" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__attachment_ids +msgid "Attachments" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_email_template_preview__conditional_attachment_ids +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template__conditional_attachment_ids +#: model_terms:ir.ui.view,arch_db:mail_template_conditional_attachment.email_template_form +msgid "Conditional Attachments" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__create_uid +msgid "Created by" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__create_date +msgid "Created on" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__name +msgid "Description" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__display_name +msgid "Display Name" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model,name:mail_template_conditional_attachment.model_mail_template +msgid "Email Templates" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__id +msgid "ID" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,help:mail_template_conditional_attachment.field_mail_template_conditional_attachment__filter_domain +msgid "If present, this condition must be satisfied to include the attachments." +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__write_date +msgid "Last Updated on" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__mail_template_id +msgid "Mail Template" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model,name:mail_template_conditional_attachment.model_mail_template_conditional_attachment +msgid "Mail Template Conditional Attachment" +msgstr "" + +#. module: mail_template_conditional_attachment +#: model:ir.model.fields,field_description:mail_template_conditional_attachment.field_mail_template_conditional_attachment__model_name +msgid "Model" +msgstr "" + diff --git a/mail_template_conditional_attachment/static/description/icon.png b/mail_template_conditional_attachment/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd60220fbe2d7465dd81af8ca6d5af032879c144 GIT binary patch literal 9673 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 - + Email Template Conditional Attachment