'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)
'''
if context is None:
context = {}
+
# composition wizard options
email_mode = context.get('email_mode')
formatting = context.get('formatting')
# 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'}