diff options
Diffstat (limited to 'addons/mail')
| -rw-r--r-- | addons/mail/models/mail_mail.py | 13 | ||||
| -rw-r--r-- | addons/mail/models/mail_message.py | 14 | ||||
| -rw-r--r-- | addons/mail/models/mail_thread.py | 2 | ||||
| -rw-r--r-- | addons/mail/models/res_partner.py | 2 | ||||
| -rw-r--r-- | addons/mail/wizard/invite.py | 30 |
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') |
