Encrypt PDF-Attachments when documents are sent by mail
							parent
							
								
									4c605bd123
								
							
						
					
					
						commit
						216b766571
					
				|  | @ -0,0 +1,124 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Part of Odoo. See LICENSE file for full copyright and licensing details. | ||||
| 
 | ||||
| import base64 | ||||
| import PyPDF2 | ||||
| import io | ||||
| 
 | ||||
| from odoo import _, api, fields, models, tools | ||||
| from odoo.tools import pycompat | ||||
| 
 | ||||
| 
 | ||||
| class MailTemplate(models.Model): | ||||
| 
 | ||||
|     _inherit = 'mail.template' | ||||
| 
 | ||||
|     @api.multi | ||||
|     def generate_email(self, res_ids, fields=None): | ||||
|         """Generates an email from the template for given the given model based on | ||||
|         records given by res_ids. | ||||
| 
 | ||||
|         :param template_id: id of the template to render. | ||||
|         :param res_id: id of the record to use for rendering the template (model | ||||
|                        is taken from template definition) | ||||
|         :returns: a dict containing all relevant fields for creating a new | ||||
|                   mail.mail entry, with one extra key ``attachments``, in the | ||||
|                   format [(report_name, data)] where data is base64 encoded. | ||||
|         """ | ||||
|         self.ensure_one() | ||||
|         multi_mode = True | ||||
|         if isinstance(res_ids, pycompat.integer_types): | ||||
|             res_ids = [res_ids] | ||||
|             multi_mode = False | ||||
|         if fields is None: | ||||
|             fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'scheduled_date'] | ||||
| 
 | ||||
|         res_ids_to_templates = self.get_email_template(res_ids) | ||||
| 
 | ||||
|         # templates: res_id -> template; template -> res_ids | ||||
|         templates_to_res_ids = {} | ||||
|         for res_id, template in res_ids_to_templates.items(): | ||||
|             templates_to_res_ids.setdefault(template, []).append(res_id) | ||||
| 
 | ||||
|         results = dict() | ||||
|         for template, template_res_ids in templates_to_res_ids.items(): | ||||
|             Template = self.env['mail.template'] | ||||
|             # generate fields value for all res_ids linked to the current template | ||||
|             if template.lang: | ||||
|                 Template = Template.with_context(lang=template._context.get('lang')) | ||||
|             for field in fields: | ||||
|                 Template = Template.with_context(safe=field in {'subject'}) | ||||
|                 generated_field_values = Template.render_template( | ||||
|                     getattr(template, field), template.model, template_res_ids, | ||||
|                     post_process=(field == 'body_html')) | ||||
|                 for res_id, field_value in generated_field_values.items(): | ||||
|                     results.setdefault(res_id, dict())[field] = field_value | ||||
|             # compute recipients | ||||
|             if any(field in fields for field in ['email_to', 'partner_to', 'email_cc']): | ||||
|                 results = template.generate_recipients(results, template_res_ids) | ||||
|             # update values for all res_ids | ||||
|             for res_id in template_res_ids: | ||||
|                 values = results[res_id] | ||||
|                 # body: add user signature, sanitize | ||||
|                 if 'body_html' in fields and template.user_signature: | ||||
|                     signature = self.env.user.signature | ||||
|                     if signature: | ||||
|                         values['body_html'] = tools.append_content_to_html(values['body_html'], signature, plaintext=False) | ||||
|                 if values.get('body_html'): | ||||
|                     values['body'] = tools.html_sanitize(values['body_html']) | ||||
|                 # technical settings | ||||
|                 values.update( | ||||
|                     mail_server_id=template.mail_server_id.id or False, | ||||
|                     auto_delete=template.auto_delete, | ||||
|                     model=template.model, | ||||
|                     res_id=res_id or False, | ||||
|                     attachment_ids=[attach.id for attach in template.attachment_ids], | ||||
|                 ) | ||||
| 
 | ||||
|             # Add report in attachments: generate once for all template_res_ids | ||||
|             if template.report_template: | ||||
|                 for res_id in template_res_ids: | ||||
|                     attachments = [] | ||||
|                     report_name = self.render_template(template.report_name, template.model, res_id) | ||||
|                     report = template.report_template | ||||
|                     report_service = report.report_name | ||||
| 
 | ||||
|                     if report.report_type not in ['qweb-html', 'qweb-pdf']: | ||||
|                         raise UserError(_('Unsupported report type %s found.') % report.report_type) | ||||
|                     result, format = report.render_qweb_pdf([res_id]) | ||||
| 
 | ||||
|                     output = PyPDF2.PdfFileWriter() | ||||
|                     input = PyPDF2.PdfFileReader(io.BytesIO(result)) | ||||
| 
 | ||||
|                     a = len(input.pages) | ||||
| 
 | ||||
|                     for i in range(0, a): | ||||
|                         output.addPage(input.getPage(i)) | ||||
| 
 | ||||
|                     passphrase = str(values.get('partner_ids'))+"!" | ||||
| 
 | ||||
|                     Model = self.env[self.model] | ||||
|                     record_ids = Model.browse(res_ids) | ||||
|                     for record_id in record_ids: | ||||
|                         passphrase = str(record_id.partner_id.ref)+"!" | ||||
| 
 | ||||
|                     output.encrypt(passphrase, use_128bit=True) | ||||
| 
 | ||||
|                     output._header | ||||
| 
 | ||||
|                     result_bytes_stream = io.BytesIO() | ||||
|                     output.write(result_bytes_stream) | ||||
|                     result_bytes_stream.seek(0) | ||||
| 
 | ||||
|                     result = base64.b64encode(result_bytes_stream.read()) | ||||
| 
 | ||||
|                     if not report_name: | ||||
|                         report_name = 'report.' + report_service | ||||
|                     ext = "." + format | ||||
|                     if not report_name.endswith(ext): | ||||
|                         report_name += ext | ||||
|                     attachments.append((report_name, result)) | ||||
|                     results[res_id]['attachments'] = attachments | ||||
| 
 | ||||
|         return multi_mode and results or results[res_ids[0]] | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue