Skip to content

Commit

Permalink
⚡ mail_private New: added ability to select channels for private mess…
Browse files Browse the repository at this point in the history
…age sending
  • Loading branch information
Ommo73 committed Apr 1, 2019
1 parent 2356d4e commit 4655aa6
Show file tree
Hide file tree
Showing 8 changed files with 205 additions and 3 deletions.
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
5 changes: 5 additions & 0 deletions mail_private/doc/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
`1.1.0`
-------

- **New**: added ability to select channels for private message sending.

`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
53 changes: 53 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 @@ -12,3 +18,50 @@ 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'].browse(self._context['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
117 changes: 115 additions & 2 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 Down Expand Up @@ -33,13 +39,18 @@ 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;
return self.get_channels_for_internal_message();
}).then(function (data) {
self.channels_for_internal_message = data;
self.open_composer({is_private: true});
});
},
Expand Down Expand Up @@ -68,6 +79,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 +121,99 @@ 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 partner ids
return new Model('mail.followers').call(
'read', [follower_ids, ['channel_id']]).then(function (res_partners) {
// Filter result and push to array
var res_partners_filtered = _.map(res_partners, function (partner) {
if (partner.channel_id[0]) {
return partner.channel_id[0];
}
}).filter(function (partner) {
return typeof partner !== 'undefined';
});

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

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;
var def = $.Deferred();
this._super().then(function (message) {
message = _.extend(message, {
subtype: 'mail.mt_comment',
message_type: 'comment',
content_subtype: 'html',
context: self.context,
});

// Subtype
if (self.options.is_log) {
message.subtype = 'mail.mt_note';
}

// for module mail_private
if (self.options.is_private) {
message.context.is_private = true;
message.context.channel_ids = self.get_checked_channels_ids();
message.channel_ids = self.get_checked_channels_ids();
}

// Partner_ids
if (self.options.is_log) {
def.resolve(message);
} else {
var checked_suggested_partners = self.get_checked_suggested_partners();
self.check_suggested_partners(checked_suggested_partners).done(function (partner_ids) {
message.partner_ids = (message.partner_ids || []).concat(partner_ids);
// update context
message.context = _.defaults({}, message.context, {
mail_post_autofollow: true,
});
def.resolve(message);
});
}

});

return def;
},

on_open_full_composer: function() {
Expand Down Expand Up @@ -177,6 +276,20 @@ MailComposer.include({
return checked_partners;
},

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');
checked_channels = checked_channels.concat(_.filter(self.suggested_channels, function(item) {
if (full_name === item.full_name) {
checked_channels.push(item.channel_id);
}
}));
});
return checked_channels;
},

});

});
16 changes: 16 additions & 0 deletions mail_private/static/src/xml/mail_private.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--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).-->
<template>

<t t-extend="mail.Chatter">
Expand All @@ -20,6 +26,16 @@
</span>
</t>
<t t-jquery="div[class='o_composer_suggested_partners']" t-operation="after">
<div class="o_composer_suggested_channels">
<t t-foreach='widget.suggested_channels' t-as='channel'>
<div t-attf-title="Add as channel and follower">
<input type="checkbox"
t-att-checked="channel.checked ? 'checked' : undefined"
t-att-data-fullname="channel.full_name"/>
<t t-esc="channel.name"/>
</div>
</t>
</div>
<button class="btn btn-sm btn-link oe_composer_uncheck" t-if="widget.options.is_private">Uncheck all</button>
</t>
</t>
Expand Down
2 changes: 2 additions & 0 deletions mail_private/template.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Copyright 2016 x620 <https://github.com/x620>
License LGPL-3.0 (https://www.gnu.org/licenses/lgpl.html).-->
<openerp>
<data>
<template
Expand Down

0 comments on commit 4655aa6

Please sign in to comment.