diff --git a/res_partner_mails_count/README.rst b/res_partner_mails_count/README.rst new file mode 100644 index 0000000..5b1e33e --- /dev/null +++ b/res_partner_mails_count/README.rst @@ -0,0 +1,16 @@ +Smart buttons for mails count +============================= + +This module adds Smart buttons with "Mails from" and "Mails to" count of mails in the partner form. + +Usage +----- + +You can see Smart buttons "Mails from" and "Mails to" in the contact form in the Messaging/Contacts menu. If you click on these buttons, you can see list of corresponded mails. Click on the "Send a message" link to send mail to the partner. + +Further information +------------------- + +HTML Description: https://apps.odoo.com/apps/modules/8.0/res_partner_mails_count/ + +Tested on Odoo 8.0 5209f6d2f26a38f66c063f05d32a962974741f40 \ No newline at end of file diff --git a/res_partner_mails_count/__init__.py b/res_partner_mails_count/__init__.py new file mode 100644 index 0000000..0f7cb6b --- /dev/null +++ b/res_partner_mails_count/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import models \ No newline at end of file diff --git a/res_partner_mails_count/__openerp__.py b/res_partner_mails_count/__openerp__.py new file mode 100644 index 0000000..8d66d84 --- /dev/null +++ b/res_partner_mails_count/__openerp__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +{ + "name": """Partner mails count""", + "summary": """Displays amount of incoming and outgoing partner mails.""", + "category": "Sales Management", + "images": ['images/1.png'], + "version": "1.0.0", + + "author": "IT-Projects LLC", + "website": "https://it-projects.info", + "license": "GPL-3", + "price": 30.00, + "currency": "EUR", + + "depends": [ + 'base', + 'mail' , + 'web_tour_extra' , + ], + "external_dependencies": {"python": [], "bin": []}, + "data": [ + 'views/res_partner_mails_count.xml', + 'templates.xml', + ], + "demo": [ + ], + "installable": True, + "auto_install": False, +} diff --git a/res_partner_mails_count/images/1.png b/res_partner_mails_count/images/1.png new file mode 100644 index 0000000..7ce0c13 Binary files /dev/null and b/res_partner_mails_count/images/1.png differ diff --git a/res_partner_mails_count/models.py b/res_partner_mails_count/models.py new file mode 100644 index 0000000..0ca91e6 --- /dev/null +++ b/res_partner_mails_count/models.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from openerp import models, fields, api + + +class res_partner(models.Model): + _inherit = 'res.partner' + mails_to = fields.Integer(compute="_mails_to") + mails_from = fields.Integer(compute="_mails_from") + + @api.one + def _mails_to(self): + for r in self: + r.mails_to = self.env['mail.message'].sudo().search_count([('notified_partner_ids', 'in', r.id)]) + + @api.one + def _mails_from(self): + for r in self: + r.mails_from = self.env['mail.message'].sudo().search_count([('author_id', '=', r.id)]) diff --git a/res_partner_mails_count/static/description/1.png b/res_partner_mails_count/static/description/1.png new file mode 100644 index 0000000..7ce0c13 Binary files /dev/null and b/res_partner_mails_count/static/description/1.png differ diff --git a/res_partner_mails_count/static/description/2.png b/res_partner_mails_count/static/description/2.png new file mode 100644 index 0000000..c335c0d Binary files /dev/null and b/res_partner_mails_count/static/description/2.png differ diff --git a/res_partner_mails_count/static/description/3.png b/res_partner_mails_count/static/description/3.png new file mode 100644 index 0000000..9492b47 Binary files /dev/null and b/res_partner_mails_count/static/description/3.png differ diff --git a/res_partner_mails_count/static/description/icon.png b/res_partner_mails_count/static/description/icon.png new file mode 100644 index 0000000..79f7d8f Binary files /dev/null and b/res_partner_mails_count/static/description/icon.png differ diff --git a/res_partner_mails_count/static/description/index.html b/res_partner_mails_count/static/description/index.html new file mode 100644 index 0000000..88090b0 --- /dev/null +++ b/res_partner_mails_count/static/description/index.html @@ -0,0 +1,34 @@ +
+
+
+

Smart buttons for mails count

+

Display amount of messages from/to customer

+

+ Open partner (customer) form and look up how many messages he got and sent: + +

+

+ If you click any of this buttons: + +

+

+ You will see those mails: + +

+
+ +
+
+
+
+ +
+
diff --git a/res_partner_mails_count/static/src/js/main.js b/res_partner_mails_count/static/src/js/main.js new file mode 100644 index 0000000..16c9d56 --- /dev/null +++ b/res_partner_mails_count/static/src/js/main.js @@ -0,0 +1,10 @@ +openerp.res_partner_mails_count = function(instance){ + instance.mail.Wall.include({ + init: function(){ + this._super.apply(this, arguments); + if(this.context.ignore_search_model){ + delete this.defaults.model; + } + } + }); +}; diff --git a/res_partner_mails_count/static/src/js/res_partner_mails_count_tour.js b/res_partner_mails_count/static/src/js/res_partner_mails_count_tour.js new file mode 100644 index 0000000..b64e84b --- /dev/null +++ b/res_partner_mails_count/static/src/js/res_partner_mails_count_tour.js @@ -0,0 +1,46 @@ +(function () { + 'use strict'; + + var _t = openerp._t; + + openerp.Tour.register({ + id: 'mails_count_tour', + name: _t("Mails count Tour"), + mode: 'test', + path: '/web?res_partner_mails_count=tutorial#id=3&view_type=form&model=res.partner', + // mode: 'tutorial', + steps: [ + { + title: _t("Mails count tutorial"), + content: _t("Let's see how mails count work."), + popover: { next: _t("Start Tutorial"), end: _t("Skip") }, + }, + { + title: _t("New fields"), + content: _t("Here is new fields with mails counters. Press one of it."), + element: '.mails_to', + + }, + { + waitNot: '.mails_to:visible', + title: _t("Send message from here"), + placement: 'left', + content: _t("Now you can see corresponding mails. You can send mail to this partner right from here. Press 'Send a mesage'."), + element: '.oe_mail_wall .oe_msg.oe_msg_composer_compact>div>.oe_compose_post', + }, + { + title: "New message", + placement: 'left', + content: _t("You can type message here."), + element: 'div.oe_msg_content>textarea.field_text', + }, + { + wait: '7000', + title: "That's it", + content: _t("Enjoy your day!

IT-Projects LLC team "), + popover: { next: _t("Close Tutorial") }, + }, + ] + }); + +}()); diff --git a/res_partner_mails_count/templates.xml b/res_partner_mails_count/templates.xml new file mode 100644 index 0000000..0541d56 --- /dev/null +++ b/res_partner_mails_count/templates.xml @@ -0,0 +1,60 @@ + + + + + + + mail.message.search.notified_partner + mail.message + 50 + + + + + + + + + + res.partner.mails.count + res.partner + + + + + + + + + + + res_partner_mails_count Tutorial + + self + + + + open + 200 + + + diff --git a/res_partner_mails_count/tests/__init__.py b/res_partner_mails_count/tests/__init__.py new file mode 100644 index 0000000..e5b223e --- /dev/null +++ b/res_partner_mails_count/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import test_mail +from . import test_phantom diff --git a/res_partner_mails_count/tests/test_mail.py b/res_partner_mails_count/tests/test_mail.py new file mode 100644 index 0000000..f606964 --- /dev/null +++ b/res_partner_mails_count/tests/test_mail.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from openerp.tests.common import TransactionCase + + +class test_message_count(TransactionCase): + post_install = True + def test_count(self): + new_partner1 = self.env['res.partner'].sudo().create({'name': 'rpmc Test Partner one', 'email': 'tt@tt', 'notify_email': 'always'}) + new_partner2 = self.env['res.partner'].sudo().create({'name': 'rpmc Test Partner two', 'email': 'rr@rr', 'notify_email': 'always'}) + self.assertEqual(new_partner1.mails_to, 0, 'rpmc: new partner have mails_to != 0') + mail_compose = self.env['mail.compose.message'] + compose = mail_compose.with_context( + { + 'default_composition_mode': 'comment', + }).create( + { + 'subject': 'test subj', + 'body': 'test body', + 'partner_ids': [(4, new_partner2.id)], + 'email_from': 'tt@tt', + 'author_id': new_partner1.id + }) + compose.send_mail() + self.assertEqual(new_partner1.mails_to, 0) + self.assertEqual(new_partner1.mails_from, 1, 'rpmc: one message but mails_from != 1') + self.assertEqual(new_partner2.mails_to, 1, 'rpmc: one message but mails_to != 1') + self.assertEqual(new_partner2.mails_from, 0) + compose.send_mail() + self.assertEqual(new_partner1.mails_to, 0) + self.assertEqual(new_partner1.mails_from, 2, 'rpmc: one message but mails_from != 2') + self.assertEqual(new_partner2.mails_to, 2, 'rpmc: one message but mails_to != 2') + self.assertEqual(new_partner2.mails_from, 0) \ No newline at end of file diff --git a/res_partner_mails_count/tests/test_phantom.py b/res_partner_mails_count/tests/test_phantom.py new file mode 100644 index 0000000..515d55b --- /dev/null +++ b/res_partner_mails_count/tests/test_phantom.py @@ -0,0 +1,18 @@ +import openerp.tests + +@openerp.tests.common.at_install(False) +@openerp.tests.common.post_install(True) +class TestUi(openerp.tests.HttpCase): + def test_01_res_partner_mails_to_count(self): + self.phantom_js('/', "openerp.Tour.run('mails_count_tour', 'test')", "openerp.Tour.tours.mails_count_tour", login="admin") + + def test_02_res_partner_mails_from_count(self): + # wait till page loaded and then click and wait again + code = """ + setTimeout(function () { + $(".mails_from").click(); + setTimeout(function () {console.log('ok');}, 3000); + }, 3000); + """ + link = '/web#id=3&view_type=form&model=res.partner' + self.phantom_js(link, code, "openerp.Tour.tours.mails_count_tour", login="admin") diff --git a/res_partner_mails_count/views/res_partner_mails_count.xml b/res_partner_mails_count/views/res_partner_mails_count.xml new file mode 100644 index 0000000..bd2d7d0 --- /dev/null +++ b/res_partner_mails_count/views/res_partner_mails_count.xml @@ -0,0 +1,18 @@ + + + + + Mails + mail.wall + mail.message + { + 'ignore_search_model': True, + } + +

+ Mails not found. Probably, they exist, but you don't have access. +

+
+
+
+