diff options
Diffstat (limited to 'addons/mail/models')
| -rw-r--r-- | addons/mail/models/mail_alias.py | 2 | ||||
| -rw-r--r-- | addons/mail/models/mail_channel.py | 27 | ||||
| -rw-r--r-- | addons/mail/models/mail_mail.py | 1 | ||||
| -rw-r--r-- | addons/mail/models/mail_template.py | 2 | ||||
| -rw-r--r-- | addons/mail/models/mail_thread.py | 7 |
5 files changed, 27 insertions, 12 deletions
diff --git a/addons/mail/models/mail_alias.py b/addons/mail/models/mail_alias.py index 6111a275824..ba1afd02d45 100644 --- a/addons/mail/models/mail_alias.py +++ b/addons/mail/models/mail_alias.py @@ -78,7 +78,7 @@ class Alias(models.Model): help="Policy to post a message on the document using the mailgateway.\n" "- everyone: everyone can post\n" "- partners: only authenticated partners\n" - "- followers: only followers of the related document\n") + "- followers: only followers of the related document or members of following channels\n") _sql_constraints = [ ('alias_unique', 'UNIQUE(alias_name)', 'Unfortunately this email alias is already used, please choose a unique one') diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index 98310715767..16511df100d 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import datetime -import time import uuid from openerp import _, api, fields, models, modules, tools @@ -18,11 +17,11 @@ class ChannelPartner(models.Model): _table = 'mail_channel_partner' _rec_name = 'partner_id' - partner_id = fields.Many2one('res.partner', string='Recipient') - channel_id = fields.Many2one('mail.channel', string='Channel') + partner_id = fields.Many2one('res.partner', string='Recipient', ondelete='cascade') + channel_id = fields.Many2one('mail.channel', string='Channel', ondelete='cascade') seen_message_id = fields.Many2one('mail.message', string='Last Seen') fold_state = fields.Selection([('open', 'Open'), ('folded', 'Folded'), ('closed', 'Closed')], string='Conversation Fold State', default='open') - is_minimized = fields.Boolean("Conversation is minimied") + is_minimized = fields.Boolean("Conversation is minimized") is_pinned = fields.Boolean("Is pinned on the interface", default=True) @@ -52,6 +51,7 @@ class Channel(models.Model): channel_last_seen_partner_ids = fields.One2many('mail.channel.partner', 'channel_id', string='Last Seen') channel_partner_ids = fields.Many2many('res.partner', 'mail_channel_partner', 'channel_id', 'partner_id', string='Listeners') channel_message_ids = fields.Many2many('mail.message', 'mail_message_mail_channel_rel') + is_member = fields.Boolean('Is a member', compute='_compute_is_member') # access public = fields.Selection([ ('public', 'Everyone'), @@ -91,6 +91,16 @@ class Channel(models.Model): def _compute_is_subscribed(self): self.is_subscribed = self.env.user.partner_id in self.channel_partner_ids + @api.multi + def _compute_is_member(self): + memberships = self.env['mail.channel.partner'].sudo().search([ + ('channel_id', 'in', self.ids), + ('partner_id', '=', self.env.user.partner_id.id), + ]) + membership_ids = memberships.mapped('channel_id') + for record in self: + record.is_member = record in membership_ids + @api.one @api.depends('image') def _get_image(self): @@ -166,11 +176,14 @@ class Channel(models.Model): @api.multi def action_unfollow(self): - result = self.write({'channel_partner_ids': [(3, self.env.user.partner_id.id)]}) - self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.env.user.partner_id.id), self.channel_info('unsubscribe')[0]) + partner_id = self.env.user.partner_id.id + channel_info = self.channel_info('unsubscribe')[0] # must be computed before leaving the channel (access rights) + result = self.write({'channel_partner_ids': [(3, partner_id)]}) + self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', partner_id), channel_info) if not self.email_send: notification = _('<div class="o_mail_notification">left <a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a></div>') % (self.id, self.name,) - self.message_post(body=notification, message_type="notification", subtype="mail.mt_comment") + # post 'channel left' message as root since the partner just unsubscribed from the channel + self.sudo().message_post(body=notification, message_type="notification", subtype="mail.mt_comment", author_id=partner_id) return result @api.multi diff --git a/addons/mail/models/mail_mail.py b/addons/mail/models/mail_mail.py index 0e43d934e3e..2846ac0598c 100644 --- a/addons/mail/models/mail_mail.py +++ b/addons/mail/models/mail_mail.py @@ -6,7 +6,6 @@ import logging import threading from email.utils import formataddr -from urlparse import urljoin import psycopg2 diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py index f9ce655e855..25e173e1f07 100644 --- a/addons/mail/models/mail_template.py +++ b/addons/mail/models/mail_template.py @@ -101,7 +101,7 @@ class MailTemplate(models.Model): return res name = fields.Char('Name') - model_id = fields.Many2one('ir.model', 'Applies to', help="The kind of document with with this template can be used") + model_id = fields.Many2one('ir.model', 'Applies to', help="The type of document this template can be used with") model = fields.Char('Related Document Model', related='model_id.model', select=True, store=True, readonly=True) lang = fields.Char('Language', help="Optional translation language (ISO code) to select when sending out an email. " diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 21b360a6b73..9164f51697f 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -4,7 +4,6 @@ import base64 import datetime import dateutil import email -import json import lxml from lxml import etree import logging @@ -872,7 +871,11 @@ class MailThread(models.AbstractModel): obj = record_set[0] else: obj = self.env[alias.alias_parent_model_id.model].browse(alias.alias_parent_thread_id) - if not author_id or author_id not in [fol.id for fol in obj.message_partner_ids]: + accepted_partner_ids = list( + set(partner.id for partner in obj.message_partner_ids) | + set(partner.id for channel in obj.message_channel_ids for partner in channel.channel_partner_ids) + ) + if not author_id or author_id not in accepted_partner_ids: _warn('alias %s restricted to internal followers, skipping' % alias.alias_name) _create_bounce_email() return False |
