summaryrefslogtreecommitdiff
path: root/addons/mail/models
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/models')
-rw-r--r--addons/mail/models/mail_alias.py2
-rw-r--r--addons/mail/models/mail_channel.py27
-rw-r--r--addons/mail/models/mail_mail.py1
-rw-r--r--addons/mail/models/mail_template.py2
-rw-r--r--addons/mail/models/mail_thread.py7
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