[IMP] mail: create new partner with email from

bzr revid: chm@openerp.com-20130108124310-le3hx95yn3jhfhaq
This commit is contained in:
Christophe Matthieu 2013-01-08 13:43:10 +01:00
parent 459da1fb46
commit fee9f63912
2 changed files with 76 additions and 61 deletions

View File

@ -28,6 +28,7 @@ import pytz
import time
import xmlrpclib
from email.message import Message
import re
from openerp import tools
from openerp import SUPERUSER_ID
@ -906,8 +907,41 @@ class mail_thread(osv.AbstractModel):
return mail_message.create(cr, uid, values, context=context)
def new_email_partner(self, cr, uid, emails, context=None):
""" Convert a list of emails into a list partner_ids and a list new_partner_ids
"""
partner_obj = self.pool.get('res.partner')
mail_message_obj = self.pool.get('mail.message')
partner_ids = []
new_partner_ids = []
for email in emails:
m = re.search(r"((.+?)\s*<)?([^<>]+@[^<>]+)>?", email, re.IGNORECASE | re.DOTALL)
name = m.group(2) or m.group(0)
email = m.group(3)
ids = partner_obj.search(cr, SUPERUSER_ID, [('email', '=', email)], context=context)
if ids:
partner_ids += ids
else:
partner_id = partner_obj.create(cr, uid, {
'name': name or email,
'email': email,
}, context=context)
new_partner_ids.append(partner_id)
# link mail with this from mail to the new partner id
message_ids = mail_message_obj.search(cr, SUPERUSER_ID, ['|', ('email_from', '=', email), ('email_from', 'ilike', '<%s>' % email), ('author_id', '=', False)], context=context)
if message_ids:
mail_message_obj.write(cr, SUPERUSER_ID, message_ids, {'email_from': None, 'author_id': partner_id}, context=context)
return {
'partner_ids': partner_ids,
'new_partner_ids': new_partner_ids,
}
def message_post_user_api(self, cr, uid, thread_id, body='', parent_id=False,
attachment_ids=None, extra_emails=None, content_subtype='plaintext',
attachment_ids=None, content_subtype='plaintext',
context=None, **kwargs):
""" Wrapper on message_post, used for user input :
- mail gateway
@ -922,22 +956,8 @@ class mail_thread(osv.AbstractModel):
to the related document. Should only be set by Chatter.
- extra_email: [ 'Fabien <fpi@openerp.com>', 'al@openerp.com' ]
"""
partner_obj = self.pool.get('res.partner')
mail_message_obj = self.pool.get('mail.message')
ir_attachment = self.pool.get('ir.attachment')
extra_emails = extra_emails or []
# 1.A.1: pre-process partners and incoming extra_emails
partner_ids = set([])
for email in extra_emails:
partner_id = partner_obj.find_or_create(cr, uid, email, context=context)
# link mail with this from mail to the new partner id
partner_msg_ids = mail_message_obj.search(cr, SUPERUSER_ID, ['|', ('email_from', '=', email), ('email_from', 'ilike', '<%s>' % email), ('author_id', '=', False)], context=context)
if partner_id and partner_msg_ids:
mail_message_obj.write(cr, SUPERUSER_ID, partner_msg_ids, {'email_from': None, 'author_id': partner_id}, context=context)
partner_ids.add((4, partner_id))
if partner_ids:
self.message_subscribe(cr, uid, [thread_id], [item[1] for item in partner_ids], context=context)
# 1.A.2: add recipients of parent message
if parent_id:
@ -948,7 +968,9 @@ class mail_thread(osv.AbstractModel):
partner_ids.add((4, parent_message.author_id.id))
# 1.A.3: add specified recipients
partner_ids |= set(kwargs.pop('partner_ids', []))
partner_ids = set(kwargs.pop('partner_ids', []))
if partner_ids:
self.message_subscribe(cr, uid, [thread_id], [id for id in partner_ids], context=context)
# 1.B: handle body, message_type and message_subtype
if content_subtype == 'plaintext':

View File

@ -512,13 +512,13 @@ openerp.mail = function (session) {
}
// create list of new partners
this.check_recipient_partners().done(function () {
this.check_recipient_partners().done(function (partner_ids) {
var context = {
'default_composition_mode': default_composition_mode,
'default_parent_id': self.id,
'default_body': mail.ChatterUtils.get_text2html(self.$el ? (self.$el.find('textarea:not(.oe_compact)').val() || '') : ''),
'default_attachment_ids': self.attachment_ids,
'default_partner_ids': _.map(_.filter(self.partners_from, function (f) {return f[1]}), function (f) {return f[0]}),
'default_partner_ids': partner_ids,
};
if (default_composition_mode != 'reply' && self.context.default_model && self.context.default_res_id) {
context.default_model = self.context.default_model;
@ -572,72 +572,64 @@ openerp.mail = function (session) {
check_recipient_partners: function () {
var self = this;
var partners_from = [];
var emails = [];
var deferreds = [];
_.each(this.emails_from, function (email_from) {
if (email_from[1]) {
if (!_.find(emails, function (email) {return email[4] == email_from[0][4];})) {
emails.push(email_from[0]);
deferreds.push($.Deferred());
}
if (email_from[1] && !_.find(emails, function (email) {return email == email_from[0][4];})) {
emails.push(email_from[0][1]);
}
});
this.partners_from = [];
var ds_partner = new session.web.DataSetSearch(this, 'res.partner');
_.each(emails, function (email, key) {
var deferred = deferreds[key];
ds_partner.call('search', [[['email', 'like', email[4]]]]).then(function (partner_ids) {
if (!partner_ids.length) {
var pop = new session.web.form.FormOpenPopup(this);
pop.show_element(
'res.partner',
0,
{
'default_email': email[4],
'default_name': email[3],
'force_email': true,
'ref': "compound_context",
},
{
title: _t("Please complete partner's informations"),
}
);
pop.on('closed', self, function () {
deferred.resolve();
});
pop.on('saved', self, function (id) {
self.partners_from.push([id, true]);
deferred.resolve();
});
}
else {
self.partners_from.push([partner_ids[0], true]);
var deferred_check = $.Deferred();
self.parent_thread.ds_thread._model.call('new_email_partner', [emails]).then(function (partners) {
partners_from = _.clone(partners.partner_ids);
var deferreds = [];
_.each(partners.new_partner_ids, function (id) {
var deferred = $.Deferred()
deferreds.push(deferred);
var pop = new session.web.form.FormOpenPopup(this);
pop.show_element(
'res.partner',
id,
{
'force_email': true,
'ref': "compound_context",
},
{
title: _t("Please complete partner's informations"),
}
);
pop.on('closed', self, function () {
deferred.resolve();
}
});
partners_from.push(id);
});
$.when.apply( $, deferreds ).then(function () {
deferred_check.resolve(partners_from);
});
});
return $.when.apply( $, deferreds );
return deferred_check;
},
on_message_post: function (event) {
var self = this;
if (this.do_check_attachment_upload() && (this.attachment_ids.length || this.$('textarea').val().match(/\S+/))) {
// create list of new partners
this.check_recipient_partners().done(function () {
self.do_send_message_post();
this.check_recipient_partners().done(function (partner_ids) {
self.do_send_message_post(partner_ids);
});
}
},
/*do post a message and fetch the message*/
do_send_message_post: function () {
do_send_message_post: function (partner_ids) {
var self = this;
console.log(partner_ids);
this.parent_thread.ds_thread._model.call('message_post_user_api', [this.context.default_res_id], {
'body': this.$('textarea').val(),
'subject': false,
'parent_id': this.context.default_parent_id,
'attachment_ids': _.map(this.attachment_ids, function (file) {return file.id;}),
'extra_emails': _.map(_.filter(this.emails_from, function (f) {return f[1]}), function (f) {return f[0][4]}),
'partner_ids': partner_ids,
'context': this.parent_thread.context,
}).done(function (message_id) {
var thread = self.parent_thread;
@ -1707,7 +1699,6 @@ openerp.mail = function (session) {
this.defaults[key.replace(/^search_default_/, '')] = this.context[key];
}
}
this.action.params = _.extend({
'display_indented_thread': 1,
'show_reply_button': true,
@ -1751,11 +1742,13 @@ openerp.mail = function (session) {
* @param {Object} defaults ??
*/
load_searchview: function (defaults) {
var self = this;
var ds_msg = new session.web.DataSetSearch(this, 'mail.message');
this.searchview = new session.web.SearchView(this, ds_msg, false, defaults || {}, false);
this.searchview.appendTo(this.$('.oe_view_manager_view_search'))
.then(function () { self.searchview.on('search_data', self, self.do_searchview_search); });
console.log(this.searchview);
if (this.searchview.has_defaults) {
this.searchview.ready.then(this.searchview.do_search);
}