Skip to content

Commit

Permalink
Merge pull request #182 from Ommo73/10.0-mail_private-add_channels
Browse files Browse the repository at this point in the history
10.0 mail private add channels
  • Loading branch information
itpp-bot authored Aug 11, 2019
2 parents df22626 + c045b3d commit 5a610a4
Show file tree
Hide file tree
Showing 15 changed files with 228 additions and 11 deletions.
2 changes: 1 addition & 1 deletion mail_base/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Mail Base
* fixes toggling left bar
* fixes Recipients field. Out-of-box this field could be empty.

One can say, that the module do this todo from `addons/mail/static/src/js/chat_manager.js <https://github.com/odoo/odoo/blob/9.0/addons/mail/static/src/js/chat_manager.js#L57>`__
One can say, that the module do this todo from `addons/mail/static/src/js/chat_manager.js <https://github.com/odoo/odoo/blob/10.0/addons/mail/static/src/js/chat_manager.js#L57>`__

// to do: move this to mail.utils

Expand Down
1 change: 1 addition & 0 deletions mail_base/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html)

from . import models
from . import controllers
6 changes: 5 additions & 1 deletion mail_base/__manifest__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
# -*- coding: utf-8 -*-
# Copyright 2016 x620 <https://github.com/x620>
# Copyright 2018 Ruslan Ronzhin <https://it-projects.info/team/rusllan/>
# Copyright 2016-2019 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html)
{
"name": "Mail Base",
"summary": """Makes Mail extendable""",
"category": "Discuss",
"images": [],
"version": "10.0.1.0.5",
"version": "10.0.1.1.0",

"author": "IT-Projects LLC, Pavel Romanchenko",
"support": "[email protected]",
Expand Down
3 changes: 3 additions & 0 deletions mail_base/controllers/main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2017 mikaelh <https://github.com/mikaelh>
# Copyright 2017-2019 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html)
from openerp.http import request
from openerp.addons.bus.controllers.main import BusController

Expand Down
4 changes: 4 additions & 0 deletions mail_base/doc/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
`1.1.0`
-------
- **New**: added ability to select channels for private message sending.

`1.0.5`
-------
**FIX**: polling errors on heavy server load
Expand Down
7 changes: 5 additions & 2 deletions mail_base/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2016 x620 <https://github.com/x620>
# Copyright 2017 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html)

from openerp import api, models

Expand All @@ -13,8 +16,8 @@ def write(self, values):
values['partner_ids'] = []
for triplet in values.get('needaction_partner_ids'):
if triplet[0] == 6:
for id in triplet[2]:
values['partner_ids'].append((4, id, False))
for i in triplet[2]:
values['partner_ids'].append((4, i, False))
return super(MailMessage, self).write(values)


Expand Down
6 changes: 5 additions & 1 deletion mail_base/static/lib/base.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/* Copyright 2017 Artyom Losev <https://github.com/ArtyomLosev>
Copyright 2019 Artem Rafailov <https://github.com/Ommo73>
License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html). */
odoo.define('mail_base.base', function (require) {
"use strict";

Expand Down Expand Up @@ -215,7 +218,7 @@ var MailComposer = composer.BasicComposer.extend({
var parsed_email = utils.parse_email(recipient[1]);
if (_.indexOf(email_addresses, parsed_email[1]) === -1) {
self.suggested_partners.push({
checked: true,
checked: false,
partner_id: recipient[0],
full_name: recipient[1],
name: parsed_email[0],
Expand Down Expand Up @@ -1059,6 +1062,7 @@ chat_manager.post_message = function (data, options) {
options = options || {};
var msg = {
partner_ids: data.partner_ids,
channel_ids: data.channel_ids,
body: _.str.trim(data.content),
attachment_ids: data.attachment_ids
};
Expand Down
1 change: 1 addition & 0 deletions mail_private/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html)

from . import models
10 changes: 9 additions & 1 deletion mail_private/__manifest__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
# -*- coding: utf-8 -*-
# Copyright 2016 x620 <https://github.com/x620>
# Copyright 2016 Ilmir Karamov <https://it-projects.info/team/ilmir-k>
# Copyright 2016 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
# Copyright 2017 Artyom Losev <https://github.com/ArtyomLosev>
# Copyright 2018 Ruslan Ronzhin <https://it-projects.info/team/rusllan/>
# Copyright 2018 Kolushov Alexandr <https://it-projects.info/team/KolushovAlexandr>
# Copyright 2019 Artem Rafailov <https://it-projects.info/team/Ommo73/>
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html).
{
"name": """Internal Messaging""",
"summary": """Send private messages to specified recipients, regardless of who are in followers list.""",
"category": "Discuss",
"images": ['images/mail_private_image.png'],
"version": "10.0.1.0.1",
"version": "10.0.1.1.0",
"application": False,

"author": "IT-Projects LLC, Pavel Romanchenko",
Expand Down
6 changes: 6 additions & 0 deletions mail_private/doc/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
`1.1.0`
-------

- **New**: added ability to select channels for private message sending.
- **New**: internal users are flagged automatically.

`1.0.1`
-------

Expand Down
4 changes: 4 additions & 0 deletions mail_private/full_composer_wizard.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Copyright 2017 Artyom Losev <https://github.com/ArtyomLosev>
Copyright 2018 Kolushov Alexandr <https://it-projects.info/team/KolushovAlexandr>
License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html).-->

<odoo>

<record model="ir.ui.view" id="email_compose_message_wizard_form_private">
Expand Down
73 changes: 73 additions & 0 deletions mail_private/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright 2016 x620 <https://github.com/x620>
# Copyright 2016 manawi <https://github.com/manawi>
# Copyright 2017 Artyom Losev <https://github.com/ArtyomLosev>
# Copyright 2019 Artem Rafailov <https://it-projects.info/team/Ommo73/>
# License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html).

from odoo import models, fields, api


Expand All @@ -7,8 +13,75 @@ class MailComposeMessage(models.TransientModel):

is_private = fields.Boolean(string='Send Internal Message')

def get_internal_users_ids(self):
internal_users_ids = self.env['res.users'].search([('share', '=', False)]).ids
return internal_users_ids

@api.multi
def send_mail(self, auto_commit=False):
for w in self:
w.is_log = True if w.is_private else w.is_log
super(MailComposeMessage, self).send_mail(auto_commit=False)


class MailMessage(models.Model):
_inherit = 'mail.message'

@api.multi
def _notify(self, force_send=False, send_after_commit=True, user_signature=True):
self_sudo = self.sudo()
if 'is_private' not in self_sudo._context or not self_sudo._context['is_private']:
super(MailMessage, self)._notify(force_send, send_after_commit, user_signature)
else:
self._notify_mail_private(force_send, send_after_commit, user_signature)

@api.multi
def _notify_mail_private(self, force_send=False, send_after_commit=True, user_signature=True):
""" The method was partially copied from Odoo.
In the current method, the way of getting channels for a private message is changed.
"""
# have a sudoed copy to manipulate partners (public can go here with
# website modules like forum / blog / ...

# TDE CHECK: add partners / channels as arguments to be able to notify a message with / without computation ??
self.ensure_one() # tde: not sure, just for testinh, will see

partners = self.env['res.partner'] | self.partner_ids
channels = self.env['mail.channel'] | self.channel_ids

# update message, with maybe custom values
message_values = {
'channel_ids': [(6, 0, channels.ids)],
'needaction_partner_ids': [(6, 0, partners.ids)]
}
if self.model and self.res_id and hasattr(self.env[self.model], 'message_get_message_notify_values'):
message_values.update(
self.env[self.model].browse(self.res_id).message_get_message_notify_values(self, message_values))
self.write(message_values)

# notify partners and channels
partners._notify(self, force_send=force_send, send_after_commit=send_after_commit,
user_signature=user_signature)
channels._notify(self)

# Discard cache, because child / parent allow reading and therefore
# change access rights.
if self.parent_id:
self.parent_id.invalidate_cache()

return True


class MailThread(models.AbstractModel):
_inherit = 'mail.thread'

@api.multi
@api.returns('self', lambda value: value.id)
def message_post(self, body='', subject=None, message_type='notification',
subtype=None, parent_id=False, attachments=None,
content_subtype='html', **kwargs):
if 'channel_ids' in kwargs:
kwargs['channel_ids'] = [(4, pid) for pid in kwargs['channel_ids']]
return super(MailThread, self).message_post(body, subject, message_type,
subtype, parent_id, attachments,
content_subtype, **kwargs)
98 changes: 93 additions & 5 deletions mail_private/static/src/js/mail_private.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/* Copyright 2016 x620 <https://github.com/x620>
Copyright 2016 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
Copyright 2016 manawi <https://github.com/manawi>
Copyright 2017 Artyom Losev <https://github.com/ArtyomLosev>
Copyright 2019 Artem Rafailov <https://it-projects.info/team/Ommo73/>
License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html). */
odoo.define('mail_private', function (require) {
'use strict';

Expand All @@ -22,6 +28,7 @@ Chatter.include({
var self = this;
if (this.private) {
message.subtype = false;
message.channel_ids = this.get_checked_channels_ids();
}
var options = {model: this.model, res_id: this.res_id};
chat_manager.post_message(message, options).then(
Expand All @@ -33,32 +40,38 @@ Chatter.include({
}).fail(function () {
// todo: display notification
});
},
},

on_open_composer_private_message: function (event) {
var self = this;
this.private = true;
this.get_recipients_for_internal_message().then(function (data) {
self.recipients_for_internal_message = data;
self.open_composer({is_private: true});
return self.get_channels_for_internal_message();
}).then(function (data) {
self.channels_for_internal_message = data;
self.get_internal_users_ids().then(function(res_ids){
self.open_composer({is_private: true, internal_ids: res_ids});
});
});
},

on_open_composer_new_message: function () {
this._super.apply(this, arguments);
this.private = false;
this.context.is_private = false;
},

open_composer: function (options) {
var self = this;
this._super.apply(this, arguments);
if (options && options.is_private) {

self.internal_users_ids = options.internal_ids;
this.composer.options.is_private = options.is_private;

_.each(self.recipients_for_internal_message, function (partner) {
self.composer.suggested_partners.push({
checked: (partner.user_ids.length > 0),
checked: _.intersection(self.internal_users_ids, partner.user_ids).length > 0,
partner_id: partner.id,
full_name: partner.name,
name: partner.name,
Expand All @@ -68,6 +81,15 @@ Chatter.include({
:'Follower'
});
});

_.each(self.channels_for_internal_message, function (channel) {
self.composer.suggested_channels.push({
checked: true,
channel_id: channel.id,
full_name: channel.name,
name: ('# ' + channel.name),
});
});
}
},

Expand Down Expand Up @@ -101,20 +123,86 @@ Chatter.include({
});
});
});
}
},

get_channels_for_internal_message: function () {
var self = this;
self.result = {};
return new Model(this.context.default_model).query(
['message_follower_ids', 'partner_id']).filter(
[['id', '=', self.context.default_res_id]]).all()
.then(function (thread) {
var follower_ids = thread[0].message_follower_ids;
self.result[self.context.default_res_id] = [];
self.customer = thread[0].partner_id;

// Fetch channels ids
return new Model('mail.followers').call(
'read', [follower_ids, ['channel_id']]).then(function (res_channels) {
// Filter result and push to array
var res_channels_filtered = _.map(res_channels, function (channel) {
if (channel.channel_id[0]) {
return channel.channel_id[0];
}
}).filter(function (channel) {
return typeof channel !== 'undefined';
});

return new Model('mail.channel').call(
'read', [res_channels_filtered, ['name', 'id']]
).then(function (recipients) {
return recipients;
});
});
});
},

get_internal_users_ids: function () {
var ResUser = new Model('mail.compose.message');
this.users_ids = ResUser.call('get_internal_users_ids', [[]]).then( function (users_ids) {
return users_ids;
});
return this.users_ids;
},

get_checked_channels_ids: function () {
var self = this;
var checked_channels = [];
this.$('.o_composer_suggested_channels input:checked').each(function() {
var full_name = $(this).data('fullname').toString();
_.each(self.channels_for_internal_message, function(item) {
if (full_name === item.name) {
checked_channels.push(item.id);
}
});
});
return checked_channels;
},
});

MailComposer.include({
init: function (parent, dataset, options) {
this._super(parent, dataset, options);
this.events['click .oe_composer_uncheck'] = 'on_uncheck_recipients';
this.suggested_channels = [];

},

on_uncheck_recipients: function () {
this.$('.o_composer_suggested_partners input:checked').each(function() {
$(this).prop('checked', false);
});
this.$('.o_composer_suggested_channels input:checked').each(function() {
$(this).prop('checked', false);
});
},

preprocess_message: function () {
var self = this;
if (self.options.is_private) {
self.context.is_private = true;
}
return this._super();
},

on_open_full_composer: function() {
Expand Down
Loading

0 comments on commit 5a610a4

Please sign in to comment.