summaryrefslogtreecommitdiff
path: root/addons/mail
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail')
-rw-r--r--addons/mail/models/mail_mail.py13
-rw-r--r--addons/mail/models/mail_message.py14
-rw-r--r--addons/mail/models/mail_thread.py2
-rw-r--r--addons/mail/models/res_partner.py2
-rw-r--r--addons/mail/wizard/invite.py30
5 files changed, 47 insertions, 14 deletions
diff --git a/addons/mail/models/mail_mail.py b/addons/mail/models/mail_mail.py
index 4671c71b1ba..1d53888c9f3 100644
--- a/addons/mail/models/mail_mail.py
+++ b/addons/mail/models/mail_mail.py
@@ -61,7 +61,18 @@ class MailMail(models.Model):
# notification field: if not set, set if mail comes from an existing mail.message
if 'notification' not in values and values.get('mail_message_id'):
values['notification'] = True
- return super(MailMail, self).create(values)
+ new_mail = super(MailMail, self).create(values)
+ if values.get('attachment_ids'):
+ new_mail.attachment_ids.check(mode='read')
+ return new_mail
+
+ @api.multi
+ def write(self, vals):
+ res = super(MailMail, self).write(vals)
+ if vals.get('attachment_ids'):
+ for mail in self:
+ mail.attachment_ids.check(mode='read')
+ return res
@api.multi
def unlink(self):
diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py
index e71c4522d80..97a2b729d83 100644
--- a/addons/mail/models/mail_message.py
+++ b/addons/mail/models/mail_message.py
@@ -12,7 +12,7 @@ from odoo.exceptions import UserError, AccessError
from odoo.osv import expression
_logger = logging.getLogger(__name__)
-_image_dataurl = re.compile(r'(data:image/[a-z]+?);base64,([a-z0-9+/\n]{3,}=*)\n*([\'"])', re.I)
+_image_dataurl = re.compile(r'(data:image/[a-z]+?);base64,([a-z0-9+/\n]{3,}=*)\n*([\'"])(?: data-filename="([^"]*)")?', re.I)
class Message(models.Model):
@@ -764,12 +764,13 @@ class Message(models.Model):
def base64_to_boundary(match):
key = match.group(2)
if not data_to_url.get(key):
- name = 'image%s' % len(data_to_url)
+ name = match.group(4) if match.group(4) else 'image%s' % len(data_to_url)
attachment = Attachments.create({
'name': name,
'datas': match.group(2),
'datas_fname': name,
- 'res_model': 'mail.message',
+ 'res_model': values.get('model'),
+ 'res_id': values.get('res_id'),
})
attachment.generate_access_token()
values['attachment_ids'].append((4, attachment.id))
@@ -780,6 +781,10 @@ class Message(models.Model):
# delegate creation of tracking after the create as sudo to avoid access rights issues
tracking_values_cmd = values.pop('tracking_value_ids', False)
message = super(Message, self).create(values)
+
+ if values.get('attachment_ids'):
+ message.attachment_ids.check(mode='read')
+
if tracking_values_cmd:
message.sudo().write({'tracking_value_ids': tracking_values_cmd})
@@ -800,6 +805,9 @@ class Message(models.Model):
if 'model' in vals or 'res_id' in vals:
self._invalidate_documents()
res = super(Message, self).write(vals)
+ if vals.get('attachment_ids'):
+ for mail in self:
+ mail.attachment_ids.check(mode='read')
if 'notification_ids' in vals or 'model' in vals or 'res_id' in vals:
self._invalidate_documents()
return res
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index f21de36c28f..25ba71e0e75 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -191,6 +191,8 @@ class MailThread(models.AbstractModel):
@api.multi
def _get_message_needaction(self):
res = dict((res_id, 0) for res_id in self.ids)
+ if not res:
+ return
# search for unread messages, directly in SQL to improve performances
self._cr.execute(""" SELECT msg.res_id FROM mail_message msg
diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py
index ecf21840aff..ded7f8b7d43 100644
--- a/addons/mail/models/res_partner.py
+++ b/addons/mail/models/res_partner.py
@@ -78,7 +78,7 @@ class Partner(models.Model):
company = user.company_id
if record and hasattr(record, 'company_id'):
- company = record.company_id
+ company = record.company_id.sudo()
return {
'message': message,
diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py
index 579c304b191..c7ae892bd3a 100644
--- a/addons/mail/wizard/invite.py
+++ b/addons/mail/wizard/invite.py
@@ -1,6 +1,9 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from lxml import etree
+from lxml.html import builder as html
+
from odoo import _, api, fields, models
@@ -12,18 +15,27 @@ class Invite(models.TransientModel):
@api.model
def default_get(self, fields):
result = super(Invite, self).default_get(fields)
+ if self._context.get('mail_invite_follower_channel_only'):
+ result['send_mail'] = False
+ if 'message' not in fields:
+ return result
+
user_name = self.env.user.name_get()[0][1]
model = result.get('res_model')
res_id = result.get('res_id')
- if self._context.get('mail_invite_follower_channel_only'):
- result['send_mail'] = False
- if 'message' in fields and model and res_id:
- model_name = self.env['ir.model']._get(model).display_name
- document_name = self.env[model].browse(res_id).name_get()[0][1]
- message = _('<div><p>Hello,</p><p>%s invited you to follow %s document: %s.</p></div>') % (user_name, model_name, document_name)
- result['message'] = message
- elif 'message' in fields:
- result['message'] = _('<div><p>Hello,</p><p>%s invited you to follow a new document.</p></div>') % user_name
+ if model and res_id:
+ document = self.env['ir.model']._get(model).display_name
+ title = self.env[model].browse(res_id).display_name
+ msg_fmt = _('%(user_name)s invited you to follow %(document)s document: %(title)s')
+ else:
+ msg_fmt = _('%(user_name)s invited you to follow a new document.')
+
+ text = msg_fmt % locals()
+ message = html.DIV(
+ html.P(_('Hello,')),
+ html.P(text)
+ )
+ result['message'] = etree.tostring(message)
return result
res_model = fields.Char('Related Document Model', required=True, index=True, help='Model of the followed resource')