bzr revid: fp@tinyerp.com-20120820140901-pqvj3fj8zruit3f4
This commit is contained in:
Fabien Pinckaers 2012-08-20 16:09:01 +02:00
parent daf0f7412e
commit 9fd90c604e
4 changed files with 14 additions and 137 deletions

View File

@ -105,7 +105,9 @@ class mail_notification(osv.Model):
if towrite.get('subject', False):
towrite['subject'] = msg.name_get(cr, uid, [msg.id], context=context)[0][1]
towrite['message_id'] = msg.id
self.pool.get('mail.mail').create(cr, uid, towrite, context=context)
mail_message_obj = self.pool.get('mail.mail')
newid = mail_message_obj.create(cr, uid, towrite, context=context)
mail_message_obj.send(cr, uid, [newid], context=context)
return True

View File

@ -50,94 +50,6 @@ class mail_mail(osv.Model):
'content_subtype': 'plain',
}
# FP Note: should we use a dict instead ?
def schedule_with_attach(self, cr, uid, email_from, email_to, subject, body, model=False, type='email',
email_cc=None, reply_to=False, partner_ids=None, attachments=None,
message_id=False, references=False, res_id=False, content_subtype='plain',
headers=None, mail_server_id=False, auto_delete=False, context=None):
""" Schedule sending a new email message, to be sent the next time the
mail scheduler runs, or the next time :meth:`process_email_queue` is
called explicitly.
:param string email_from: sender email address
:param list email_to: list of recipient addresses (to be joined with commas)
:param string subject: email subject (no pre-encoding/quoting necessary)
:param string body: email body, according to the ``content_subtype``
(by default, plaintext). If html content_subtype is used, the
message will be automatically converted to plaintext and wrapped
in multipart/alternative.
:param list email_cc: optional list of string values for CC header
(to be joined with commas)
:param string model: optional model name of the document this mail
is related to (this will also be used to generate a tracking id,
used to match any response related to the same document)
:param int res_id: optional resource identifier this mail is related
to (this will also be used to generate a tracking id, used to
match any response related to the same document)
:param string reply_to: optional value of Reply-To header
:param partner_ids: destination partner_ids
:param string content_subtype: optional mime content_subtype for
the text body (usually 'plain' or 'html'), must match the format
of the ``body`` parameter. Default is 'plain', making the content
part of the mail "text/plain".
:param dict attachments: map of filename to filecontents, where
filecontents is a string containing the bytes of the attachment
:param dict headers: optional map of headers to set on the outgoing
mail (may override the other headers, including Subject,
Reply-To, Message-Id, etc.)
:param int mail_server_id: optional id of the preferred outgoing
mail server for this mail
:param bool auto_delete: optional flag to turn on auto-deletion of
the message after it has been successfully sent (default to False)
"""
if context is None:
context = {}
if attachments is None:
attachments = {}
if partner_ids is None:
partner_ids = []
attachment_obj = self.pool.get('ir.attachment')
for param in (email_to, email_cc):
if param and not isinstance(param, list):
param = [param]
partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
msg_vals = {
'subject': subject,
'date': fields.datetime.now(),
'author_id': partner_id,
'model': model,
'res_id': res_id,
'type': type,
'body': body if content_subtype != 'html' else False,
'body_html': body if content_subtype == 'html' else False,
'email_from': email_from,
'email_to': email_to and ','.join(email_to) or '',
'email_cc': email_cc and ','.join(email_cc) or '',
'partner_ids': partner_ids,
'reply_to': reply_to,
'message_id': message_id,
'references': references,
'content_subtype': content_subtype,
'headers': headers, # serialize the dict on the fly
'mail_server_id': mail_server_id,
'state': 'outgoing',
'auto_delete': auto_delete
}
email_msg_id = self.create(cr, uid, msg_vals, context)
msg = self.browse(cr, uid, email_msg_id, context)
for fname, fcontent in attachments.iteritems():
attachment_data = {
'name': fname,
'datas_fname': fname,
'datas': fcontent and fcontent.encode('base64'),
'res_model': 'mail.message',
'res_id': msg.mail_message_id.id,
}
# FP Note: what's this ???
# if context.has_key('default_type'):
# del context['default_type']
return email_msg_id
def mark_outgoing(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state':'outgoing'}, context=context)

View File

@ -552,7 +552,7 @@ class mail_thread(osv.Model):
fcontent = fcontent.encode('utf-8')
data_attach = {
'name': fname,
'datas': base64.b64encode(str(fcontent)),
'datas': fcontent,
'datas_fname': fname,
'description': _('email attachment'),
}

View File

@ -254,6 +254,7 @@ class mail_compose_message(osv.TransientModel):
'''
if context is None:
context = {}
# composition wizard options
email_mode = context.get('email_mode')
formatting = context.get('formatting')
@ -264,70 +265,32 @@ class mail_compose_message(osv.TransientModel):
# attachments
attachment = {}
for attach in mail_wiz.attachment_ids:
attachment[attach.datas_fname] = attach.datas and attach.datas.decode('base64')
attachment[attach.datas_fname] = attach.datas and attach.datas or False
# default values, according to the wizard options
subject = mail_wiz.subject if formatting else False
content_subtype = 'html' if formatting else 'plain'
type = 'email' if email_mode else 'comment'
state = 'outgoing' if email_mode else False
partner_ids = [partner.id for partner in mail_wiz.dest_partner_ids]
references = None
headers = {}
body = mail_wiz.body_html if content_subtype == 'html' else mail_wiz.body
active_model_pool = self.pool.get(active_model)
# get model, active_ids, and check if model is openchatter-enabled
if mass_mail_mode and context.get('active_ids') and context.get('active_model'):
active_ids = context['active_ids']
active_model = context['active_model']
elif mass_mail_mode:
active_model = mail_wiz.model
active_model_pool = self.pool.get(active_model)
active_ids = active_model_pool.search(cr, uid, ast.literal_eval(mail_wiz.filter_id.domain), context=ast.literal_eval(mail_wiz.filter_id.context))
else:
active_model = mail_wiz.model
active_ids = [mail_wiz.res_id]
active_model_pool = self.pool.get(active_model)
mail_thread_enabled = hasattr(active_model_pool, 'message_append')
if context.get('mail.compose.message.mode') == 'mass_mail':
# Mass mailing: must render the template patterns
for active_id in active_ids:
rendered_subject = self.render_template(cr, uid, subject, active_model, active_id)
rendered_body_html = self.render_template(cr, uid, mail_wiz.body_html, active_model, active_id)
rendered_body = self.render_template(cr, uid, mail_wiz.body, active_model, active_id)
email_from = self.render_template(cr, uid, mail_wiz.email_from, active_model, active_id)
email_to = self.render_template(cr, uid, mail_wiz.email_to, active_model, active_id)
email_cc = self.render_template(cr, uid, mail_wiz.email_cc, active_model, active_id)
reply_to = self.render_template(cr, uid, mail_wiz.reply_to, active_model, active_id)
# in mass-mailing mode we only schedule the mail for sending, it will be
# processed as soon as the mail scheduler runs.
if mail_thread_enabled:
active_model_pool.message_append(cr, uid, [active_id], rendered_subject, rendered_body, rendered_body_html,
type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids,
email_from=email_from, email_to=email_to, email_cc=email_cc,
reply_to=reply_to, references=references, attachments=attachment, headers=headers, context=context)
else:
mail_message_obj.schedule_with_attach(cr, uid, email_from, mail_tools_to_email(email_to), subject, rendered_body,
model=mail_wiz.model, email_cc=mail_tools_to_email(email_cc), reply_to=reply_to,
attachments=attachment, references=references, res_id=active_id, partner_ids=partner_ids,
content_subtype=mail_wiz.content_subtype, headers=headers, context=context)
else:
# normal mode - no mass-mailing
if mail_thread_enabled:
msg_ids = active_model_pool.message_append(cr, uid, active_ids, subject, mail_wiz.body, mail_wiz.body_html,
type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids,
email_from=mail_wiz.email_from, email_to=mail_wiz.email_to, email_cc=mail_wiz.email_cc,
reply_to=mail_wiz.reply_to, references=references, attachments=attachment, headers=headers, context=context)
else:
msg_ids = [mail_message_obj.schedule_with_attach(cr, uid, mail_wiz.email_from, mail_tools_to_email(mail_wiz.email_to), subject, mail_wiz.body,
type=type, model=mail_wiz.model, email_cc=mail_tools_to_email(mail_wiz.email_cc), reply_to=mail_wiz.reply_to,
attachments=attachment, references=references, res_id=int(mail_wiz.res_id), partner_ids=partner_ids,
content_subtype=mail_wiz.content_subtype, headers=headers, context=context)]
# in normal mode, we send the email immediately, as the user expects us to (delay should be sufficiently small)
if type == 'email':
mail_message_obj.send(cr, uid, msg_ids, context=context)
for active_id in active_ids:
if context.get('mail.compose.message.mode') == 'mass_mail':
subject = self.render_template(cr, uid, subject, active_model, active_id)
body = self.render_template(cr, uid, mail_wiz.body_html, active_model, active_id)
active_model_pool.message_append(cr, uid, active_id, body, subject, 'comment',
attachments=attachments, context=context)
return {'type': 'ir.actions.act_window_close'}