[IMP] mail_drop_target: Raise a warning when the file has already been imported

pull/519/head
Enric Tobella 2019-09-05 13:42:08 +02:00 committed by Lois Rilo
parent ec9d75b9ac
commit 49f7f8aeeb
3 changed files with 56 additions and 26 deletions

View File

@ -11,6 +11,30 @@ from odoo import _, api, exceptions, models
class MailThread(models.AbstractModel): class MailThread(models.AbstractModel):
_inherit = 'mail.thread' _inherit = 'mail.thread'
@api.model
def message_drop(self, model, message, custom_values=None,
save_original=False, strip_attachments=False,
thread_id=None):
result = self.message_process(
model, message, custom_values=custom_values,
save_original=save_original, strip_attachments=strip_attachments,
thread_id=thread_id
)
if not result:
return self.message_drop_existing(
model, message, custom_values=custom_values,
save_original=save_original,
strip_attachments=strip_attachments, thread_id=thread_id
)
return result
@api.model
def message_drop_existing(self, model, message,
custom_values=None, save_original=False,
strip_attachments=False, thread_id=None):
message = _("This message is already imported.")
raise exceptions.Warning(message)
@api.model @api.model
def message_process_msg( def message_process_msg(
self, model, message, custom_values=None, save_original=False, self, model, message, custom_values=None, save_original=False,
@ -28,12 +52,13 @@ class MailThread(models.AbstractModel):
message_msg._getStream('__substg1.0_10130102') or message_msg.body, message_msg._getStream('__substg1.0_10130102') or message_msg.body,
email_cc=message_msg.cc, email_cc=message_msg.cc,
headers={'date': message_msg.date}, headers={'date': message_msg.date},
message_id=message_msg.message_id,
attachments=[ attachments=[
(attachment.longFilename, attachment.data) (attachment.longFilename, attachment.data)
for attachment in message_msg.attachments for attachment in message_msg.attachments
], ],
) )
return self.message_process( return self.message_drop(
model, message_email.as_string(), custom_values=custom_values, model, message_email.as_string(), custom_values=custom_values,
save_original=save_original, strip_attachments=strip_attachments, save_original=save_original, strip_attachments=strip_attachments,
thread_id=thread_id, thread_id=thread_id,

View File

@ -1,9 +1,9 @@
//-*- coding: utf-8 -*- // -*- coding: utf-8 -*-
//Copyright 2018 Therp BV <https://therp.nl> // Copyright 2018 Therp BV <https://therp.nl>
//License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
odoo.define('mail_drop_target', function(require) odoo.define('mail_drop_target', function (require) {
{ "use strict";
var Chatter = require('mail.Chatter'); var Chatter = require('mail.Chatter');
var web_drop_target = require('web_drop_target'); var web_drop_target = require('web_drop_target');
@ -11,12 +11,12 @@ odoo.define('mail_drop_target', function(require)
Chatter.include({ Chatter.include({
_drop_allowed_types: ['message/rfc822'], _drop_allowed_types: ['message/rfc822'],
_get_drop_item: function(e) { _get_drop_item: function (e) {
var dataTransfer = e.originalEvent.dataTransfer; var dataTransfer = e.originalEvent.dataTransfer;
if( if (
dataTransfer.items.length == 1 && dataTransfer.items.length === 1 &&
dataTransfer.items[0].type == '' && dataTransfer.items[0].type === '' &&
dataTransfer.items[0].kind == 'file' dataTransfer.items[0].kind === 'file'
) { ) {
// this might be an outlook msg file // this might be an outlook msg file
return dataTransfer.items[0]; return dataTransfer.items[0];
@ -24,16 +24,16 @@ odoo.define('mail_drop_target', function(require)
return this._super.apply(this, arguments); return this._super.apply(this, arguments);
}, },
_handle_drop_items: function(drop_items, e) { _handle_drop_items: function (drop_items, e) {
var self = this; var self = this;
_.each(drop_items, function(item, e) { _.each(drop_items, function(item, e) {
return self._handle_file_drop_proxy(item, e); return self._handle_file_drop_proxy(item, e);
}); });
}, },
_handle_file_drop_proxy: function(item, e) { _handle_file_drop_proxy: function (item, e) {
var self = this; var self = this;
var file = item; var file = item;
if(!file || !(file instanceof Blob)) { if (!file || !(file instanceof Blob)) {
return; return;
} }
var reader = new FileReader(); var reader = new FileReader();
@ -43,7 +43,7 @@ odoo.define('mail_drop_target', function(require)
reader.onerror = self.proxy('_file_reader_error_handler'); reader.onerror = self.proxy('_file_reader_error_handler');
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file);
}, },
_handle_file_drop: function(drop_file, reader, e) { _handle_file_drop: function (drop_file, reader, e) {
var self = this, var self = this,
mail_processor = '', mail_processor = '',
data = ''; data = '';
@ -53,9 +53,9 @@ odoo.define('mail_drop_target', function(require)
new Uint8Array(reader.result) new Uint8Array(reader.result)
); );
} else { } else {
mail_processor = 'message_process'; mail_processor = 'message_drop';
var reader_array = new Uint8Array(reader.result); var reader_array = new Uint8Array(reader.result);
data = "" data = "";
for (var i = 0; i < reader_array.length; i++) { for (var i = 0; i < reader_array.length; i++) {
data += String.fromCharCode(parseInt(reader_array[i])); data += String.fromCharCode(parseInt(reader_array[i]));
} }
@ -68,11 +68,10 @@ odoo.define('mail_drop_target', function(require)
args: [this.record.model, data], args: [this.record.model, data],
kwargs: { kwargs: {
thread_id: this.record.data.id, thread_id: this.record.data.id,
} },
}) }).then(function() {
.then(function() { self.trigger_up('reload', {});
self.trigger_up('reload',{});
}); });
} },
}); });
}); });

View File

@ -1,5 +1,5 @@
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from odoo import addons, exceptions, tools from odoo import exceptions, tools
from mock import patch from mock import patch
import base64 import base64
@ -21,6 +21,9 @@ class TestMailDropTarget(TransactionCase):
self.partner._name, message, thread_id=self.partner.id) self.partner._name, message, thread_id=self.partner.id)
self.partner.refresh() self.partner.refresh()
self.assertEqual(comments+1, len(self.partner.message_ids)) self.assertEqual(comments+1, len(self.partner.message_ids))
with self.assertRaises(exceptions.Warning):
self.partner.message_drop(
self.partner._name, message, thread_id=self.partner.id)
def test_msg(self): def test_msg(self):
message = base64.b64encode(tools.file_open( message = base64.b64encode(tools.file_open(
@ -33,10 +36,13 @@ class TestMailDropTarget(TransactionCase):
self.partner._name, message, thread_id=self.partner.id) self.partner._name, message, thread_id=self.partner.id)
self.partner.refresh() self.partner.refresh()
self.assertEqual(comments+1, len(self.partner.message_ids)) self.assertEqual(comments+1, len(self.partner.message_ids))
with self.assertRaises(exceptions.Warning):
self.partner.message_process_msg(
self.partner._name, message, thread_id=self.partner.id)
def test_no_msgextract(self): def test_no_msgextract(self):
with self.assertRaises(exceptions.UserError), patch.object( with self.assertRaises(exceptions.UserError), patch(
addons.mail_drop_target.models.mail_thread, 'Message', 'odoo.addons.mail_drop_target.models.mail_thread.Message',
__nonzero__=lambda x: False, new=False,
): ):
self.test_msg() self.test_msg()