diff --git a/mail_as_letter/README.rst b/mail_as_letter/README.rst new file mode 100644 index 00000000..94b209d5 --- /dev/null +++ b/mail_as_letter/README.rst @@ -0,0 +1,60 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============== +Mail As Letter +============== + +This module allows to download a mail message as a pdf letter with formal layout. + +Usage +===== + +To use this module, you need to: + +#. Write a new email from the mail composer +#. Click on the print button to download the email as a pdf file + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/{repo_id}/{branch} + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +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. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Thomas Binsfeld + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/mail_as_letter/__init__.py b/mail_as_letter/__init__.py new file mode 100644 index 00000000..5cb1c491 --- /dev/null +++ b/mail_as_letter/__init__.py @@ -0,0 +1 @@ +from . import wizards diff --git a/mail_as_letter/__openerp__.py b/mail_as_letter/__openerp__.py new file mode 100644 index 00000000..28ce694a --- /dev/null +++ b/mail_as_letter/__openerp__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Mail As Letter', + 'summary': """ + This module allows to download a mail message as a pdf letter.""", + 'version': '9.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', + 'website': 'www.acsone.eu', + 'depends': [ + 'mail', + ], + 'data': [ + 'wizards/mail_compose_message.xml', + 'report/mail_as_letter_qweb.xml', + ], + 'demo': [ + ], +} diff --git a/mail_as_letter/report/mail_as_letter_qweb.xml b/mail_as_letter/report/mail_as_letter_qweb.xml new file mode 100644 index 00000000..0c0eda3a --- /dev/null +++ b/mail_as_letter/report/mail_as_letter_qweb.xml @@ -0,0 +1,48 @@ + + + + + + mail_as_letter + mail.compose.message + ir.actions.report.xml + mail_as_letter.report_mail_print + qweb-pdf + + + + + + + + + + diff --git a/mail_as_letter/static/description/icon.svg b/mail_as_letter/static/description/icon.svg new file mode 100644 index 00000000..a7a26d09 --- /dev/null +++ b/mail_as_letter/static/description/icon.svg @@ -0,0 +1,79 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/mail_as_letter/tests/__init__.py b/mail_as_letter/tests/__init__.py new file mode 100644 index 00000000..1b24b025 --- /dev/null +++ b/mail_as_letter/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_as_letter diff --git a/mail_as_letter/tests/test_mail_as_letter.py b/mail_as_letter/tests/test_mail_as_letter.py new file mode 100644 index 00000000..ebcc5617 --- /dev/null +++ b/mail_as_letter/tests/test_mail_as_letter.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.tests.common import TransactionCase +from openerp.exceptions import UserError + + +class TestMailAsLetter(TransactionCase): + + def setUp(self): + super(TestMailAsLetter, self).setUp() + + # ENVIRONMENTS + self.mail_compose_message = self.env['mail.compose.message'] + + # INSTANCES + # Partners + self.base_partner = self.ref('base.main_partner') + self.root_partner = self.ref('base.partner_root') + # Mail compose message + self.mail_composer = self.mail_compose_message.create({ + 'subject': "Test mail", + 'body': "Blah blah blah"}) + + def test_compute_partner_count(self): + # No partner + self.mail_composer.update({ + 'partner_ids': False}) + self.assertEqual(self.mail_composer.partner_count, 0) + # One partner + self.mail_composer.update({ + 'partner_ids': [self.base_partner]}) + self.assertEqual(self.mail_composer.partner_count, 1) + # Two partners + self.mail_composer.update({ + 'partner_ids': [self.base_partner, self.root_partner]}) + self.assertEqual(self.mail_composer.partner_count, 2) + + def test_download_pdf(self): + # With no partner + with self.assertRaises(UserError), self.cr.savepoint(): + self.mail_composer.update({ + 'partner_ids': False}) + self.mail_composer.download_pdf() + # With more than one partner + with self.assertRaises(UserError), self.cr.savepoint(): + self.mail_composer.update({ + 'partner_ids': [self.base_partner, self.root_partner]}) + self.mail_composer.download_pdf() + # With exactly one partner + self.mail_composer.update({ + 'partner_ids': [self.base_partner]}) + self.mail_composer.download_pdf() diff --git a/mail_as_letter/wizards/__init__.py b/mail_as_letter/wizards/__init__.py new file mode 100644 index 00000000..b528d997 --- /dev/null +++ b/mail_as_letter/wizards/__init__.py @@ -0,0 +1 @@ +from . import mail_compose_message diff --git a/mail_as_letter/wizards/mail_compose_message.py b/mail_as_letter/wizards/mail_compose_message.py new file mode 100644 index 00000000..f78662e0 --- /dev/null +++ b/mail_as_letter/wizards/mail_compose_message.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, fields, models, _ +from openerp.exceptions import UserError + + +class MailComposeMessage(models.TransientModel): + + _inherit = 'mail.compose.message' + + # The number of partner is needed to hide the 'print' button if + # there is more than one partner + partner_count = fields.Integer( + string='Number of partners', + compute='_compute_partner_count') + + @api.depends('partner_ids') + def _compute_partner_count(self): + for rec in self: + rec.partner_count = len(rec.partner_ids) + + @api.multi + def download_pdf(self): + ''' + Download the email in pdf format, based on a QWeb report. + ''' + self.ensure_one() + if self.partner_count != 1: + raise UserError(_("There must be only one recipient.")) + ctx = self.env.context.copy() + ctx.update({'active_id': self.id, + 'active_ids': [self.id], + 'active_model': 'mail.compose.message'}) + + return { + 'name': 'mail_as_letter', + 'model': 'mail.compose.message', + 'res_id': self.id, + 'type': 'ir.actions.report.xml', + 'report_name': + 'mail_as_letter.report_mail_print', + 'report_type': 'qweb-pdf', + 'context': ctx, } diff --git a/mail_as_letter/wizards/mail_compose_message.xml b/mail_as_letter/wizards/mail_compose_message.xml new file mode 100644 index 00000000..e18cae8e --- /dev/null +++ b/mail_as_letter/wizards/mail_compose_message.xml @@ -0,0 +1,27 @@ + + + + + + + + mail.compose.message.form (in mail_as_letter) + mail.compose.message + + + + + + + + diff --git a/setup/mail_as_letter/odoo_addons/__init__.py b/setup/mail_as_letter/odoo_addons/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/setup/mail_as_letter/odoo_addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/mail_as_letter/odoo_addons/mail_as_letter b/setup/mail_as_letter/odoo_addons/mail_as_letter new file mode 120000 index 00000000..6473fd78 --- /dev/null +++ b/setup/mail_as_letter/odoo_addons/mail_as_letter @@ -0,0 +1 @@ +../../../mail_as_letter \ No newline at end of file diff --git a/setup/mail_as_letter/setup.py b/setup/mail_as_letter/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/mail_as_letter/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)