From 70f8d15054e0abee7342415e4f62ec01ad041869 Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Wed, 25 May 2016 16:03:38 +0200 Subject: [PATCH 01/11] Add mail_optional_follower_notification module (#60) * [ADD] Add mail_optional_follower_notifications module * [CHG][mail_optional_follower_notifications] Readme. * [IMP][mail_optional_follower_notifications] Code review. * [CHG] Rename mail_optional_follower_notifications to mail_optional_follower_notification * [IMP][mail_optional_follower_notification] Review --- .../README.rst | 60 ++++++++++++++++++ .../__init__.py | 6 ++ .../__openerp__.py | 22 +++++++ .../models/__init__.py | 6 ++ .../models/mail_message.py | 19 ++++++ .../models/mail_notification.py | 19 ++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../description/optional_follower_001.png | Bin 0 -> 27097 bytes .../description/optional_follower_002.png | Bin 0 -> 32104 bytes .../tests/__init__.py | 5 ++ ...st_mail_optional_follower_notifications.py | 54 ++++++++++++++++ .../wizard/__init__.py | 5 ++ .../wizard/mail_compose_message.py | 19 ++++++ .../wizard/mail_compose_message_view.xml | 18 ++++++ 14 files changed, 233 insertions(+) create mode 100644 mail_optional_follower_notification/README.rst create mode 100644 mail_optional_follower_notification/__init__.py create mode 100644 mail_optional_follower_notification/__openerp__.py create mode 100644 mail_optional_follower_notification/models/__init__.py create mode 100644 mail_optional_follower_notification/models/mail_message.py create mode 100644 mail_optional_follower_notification/models/mail_notification.py create mode 100644 mail_optional_follower_notification/static/description/icon.png create mode 100644 mail_optional_follower_notification/static/description/optional_follower_001.png create mode 100644 mail_optional_follower_notification/static/description/optional_follower_002.png create mode 100644 mail_optional_follower_notification/tests/__init__.py create mode 100644 mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py create mode 100644 mail_optional_follower_notification/wizard/__init__.py create mode 100644 mail_optional_follower_notification/wizard/mail_compose_message.py create mode 100644 mail_optional_follower_notification/wizard/mail_compose_message_view.xml diff --git a/mail_optional_follower_notification/README.rst b/mail_optional_follower_notification/README.rst new file mode 100644 index 00000000..3132e6f0 --- /dev/null +++ b/mail_optional_follower_notification/README.rst @@ -0,0 +1,60 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +==================================== +Mail optional follower notifications +==================================== + +This module adds the possibility to choose if you want to automatically +notify followers on mail.compose.message. By default, Odoo notify +automatically all followers. + +Usage +===== + +To use this module, you need to use the checkbox near "Followers of the document and" on mail.compose.message: + +This field it's initialized to true to keep the standard behavior. + +.. figure:: static/description/optional_follower_001.png + :alt: Default checkbox + +.. figure:: static/description/optional_follower_002.png + :alt: Checkbox to avoid to notify automatically followers + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/205/8.0 + + * https://www.odoo.com/forum/help-1 + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + +Credits +======= + +Contributors +------------ + +* Adrien Peiffer + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. \ No newline at end of file diff --git a/mail_optional_follower_notification/__init__.py b/mail_optional_follower_notification/__init__.py new file mode 100644 index 00000000..98aa84d4 --- /dev/null +++ b/mail_optional_follower_notification/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models +from . import wizard diff --git a/mail_optional_follower_notification/__openerp__.py b/mail_optional_follower_notification/__openerp__.py new file mode 100644 index 00000000..5421f288 --- /dev/null +++ b/mail_optional_follower_notification/__openerp__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': "Mail optional follower notification", + + 'summary': """ + Choose if you want to automatically notify followers + on mail.compose.message""", + 'author': 'ACSONE SA/NV,' + 'Odoo Community Association (OCA)', + 'website': "http://acsone.eu", + 'category': 'Social Network', + 'version': '8.0.1.0.0', + 'license': 'AGPL-3', + 'depends': [ + 'mail', + ], + 'data': [ + 'wizard/mail_compose_message_view.xml', + ], +} diff --git a/mail_optional_follower_notification/models/__init__.py b/mail_optional_follower_notification/models/__init__.py new file mode 100644 index 00000000..cc213b9f --- /dev/null +++ b/mail_optional_follower_notification/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import mail_message +from . import mail_notification diff --git a/mail_optional_follower_notification/models/mail_message.py b/mail_optional_follower_notification/models/mail_message.py new file mode 100644 index 00000000..fe64abc0 --- /dev/null +++ b/mail_optional_follower_notification/models/mail_message.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, api + + +class MailMessage(models.Model): + _inherit = 'mail.message' + + @api.model + def create(self, values): + ctx = self.env.context.copy() + if not ctx.get('notify_followers') and values.get('partner_ids'): + partner_list = self.resolve_2many_commands( + 'partner_ids', values.get('partner_ids'), fields=['id']) + force_partners_to_notify = [d['id'] for d in partner_list] + ctx['force_partners_to_notify'] = force_partners_to_notify + return super(MailMessage, self.with_context(ctx)).create(values) diff --git a/mail_optional_follower_notification/models/mail_notification.py b/mail_optional_follower_notification/models/mail_notification.py new file mode 100644 index 00000000..47cf08b6 --- /dev/null +++ b/mail_optional_follower_notification/models/mail_notification.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, api + + +class MailNotification(models.Model): + _inherit = 'mail.notification' + + @api.model + def _notify(self, message_id, partners_to_notify=None, + force_send=False, user_signature=True): + if self.env.context.get('force_partners_to_notify'): + partners_to_notify =\ + self.env.context.get('force_partners_to_notify') + super(MailNotification, self)._notify( + message_id, partners_to_notify=partners_to_notify, + force_send=force_send, user_signature=user_signature) diff --git a/mail_optional_follower_notification/static/description/icon.png b/mail_optional_follower_notification/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/mail_optional_follower_notification/static/description/optional_follower_001.png b/mail_optional_follower_notification/static/description/optional_follower_001.png new file mode 100644 index 0000000000000000000000000000000000000000..897e596cfed35f9f294bda200c4ab1ee4ca2cc6f GIT binary patch literal 27097 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 W|6`JU{Q>;ZzMI+xT7}ncKlnfQxV$w0 literal 0 HcmV?d00001 diff --git a/mail_optional_follower_notification/static/description/optional_follower_002.png b/mail_optional_follower_notification/static/description/optional_follower_002.png new file mode 100644 index 0000000000000000000000000000000000000000..24d9d9756f72063c577d84f9761610c13b29ddcc GIT binary patch literal 32104 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 Vj&4(aiU*xaT}4Z|`2LgU{|T9XBu4-M literal 0 HcmV?d00001 diff --git a/mail_optional_follower_notification/tests/__init__.py b/mail_optional_follower_notification/tests/__init__.py new file mode 100644 index 00000000..2a6791af --- /dev/null +++ b/mail_optional_follower_notification/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_mail_optional_follower_notifications diff --git a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py new file mode 100644 index 00000000..4f128323 --- /dev/null +++ b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.tests import common + + +class TestMailOptionalFollowernotifications(common.TransactionCase): + + def setUp(self): + super(TestMailOptionalFollowernotifications, self).setUp() + self.partner_obj = self.env['res.partner'] + self.partner_01 = self.env.ref('base.res_partner_2') + self.partner_02 = self.env.ref('base.res_partner_13') + self.partner_03 = self.env.ref('base.res_partner_5') + + def test_send_email_optional_follower_notifications(self): + ctx = self.env.context.copy() + ctx.update({ + 'default_model': 'res.partner', + 'default_res_id': self.partner_01.id, + 'default_composition_mode': 'comment', + }) + mail_compose = self.env['mail.compose.message'] + values = mail_compose.with_context(ctx)\ + .onchange_template_id(False, 'comment', 'res.partner', + self.partner_01.id)['value'] + values['partner_ids'] = [(4, self.partner_02.id), + (4, self.partner_03.id)] + compose_id = mail_compose.with_context(ctx).create(values) + compose_id.with_context(ctx).send_mail() + res = self.env["mail.message"].search( + [('model', '=', 'res.partner'), + ('res_id', '=', self.partner_01.id)]) + self.assertEqual(len(res.ids), 1) + message = self.env['mail.message'] + for record in res: + if record.notified_partner_ids.ids == [self.partner_03.id] and\ + record.partner_ids.ids == [self.partner_03.id]: + message += record + self.assertEqual(len(message.ids), 0) + values['partner_ids'] = [(6, 0, [self.partner_03.id])] + compose_id = mail_compose.with_context(ctx).create(values) + compose_id.notify_followers = False + compose_id.with_context(ctx).send_mail() + res = self.env["mail.message"].search( + [('model', '=', 'res.partner'), + ('res_id', '=', self.partner_01.id)]) + message = self.env['mail.message'] + for record in res: + if record.notified_partner_ids.ids == [self.partner_03.id] and\ + record.partner_ids.ids == [self.partner_03.id]: + message += record + self.assertEqual(len(message.ids), 1) diff --git a/mail_optional_follower_notification/wizard/__init__.py b/mail_optional_follower_notification/wizard/__init__.py new file mode 100644 index 00000000..56c0250a --- /dev/null +++ b/mail_optional_follower_notification/wizard/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import mail_compose_message diff --git a/mail_optional_follower_notification/wizard/mail_compose_message.py b/mail_optional_follower_notification/wizard/mail_compose_message.py new file mode 100644 index 00000000..b6bc9053 --- /dev/null +++ b/mail_optional_follower_notification/wizard/mail_compose_message.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields, api + + +class MailComposeMessage(models.TransientModel): + _inherit = 'mail.compose.message' + + notify_followers = fields.Boolean(default=True) + + @api.multi + def send_mail(self): + for wizard in self: + wizard = wizard.with_context( + notify_followers=wizard.notify_followers) + super(MailComposeMessage, wizard).send_mail() + return {'type': 'ir.actions.act_window_close'} diff --git a/mail_optional_follower_notification/wizard/mail_compose_message_view.xml b/mail_optional_follower_notification/wizard/mail_compose_message_view.xml new file mode 100644 index 00000000..62078101 --- /dev/null +++ b/mail_optional_follower_notification/wizard/mail_compose_message_view.xml @@ -0,0 +1,18 @@ + + + + + mail.compose.message.form (mail_optional_autofollow) + mail.compose.message + + + + + + + - Warning : Followers will not be notified but they can access the notification directly from the document (if they are allowed to) + + + + + \ No newline at end of file From e28bda4ebc34a238b884520a01ff3109050e1571 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Sun, 29 May 2016 11:38:16 -0400 Subject: [PATCH 02/11] OCA Transbot updated translations from Transifex --- .../i18n/ca.po | 45 ++++++++++++++++++ .../i18n/de.po | 45 ++++++++++++++++++ .../i18n/en.po | 45 ++++++++++++++++++ .../i18n/es.po | 45 ++++++++++++++++++ .../i18n/es_CO.po | 45 ++++++++++++++++++ .../i18n/pt_BR.po | 45 ++++++++++++++++++ .../i18n/sl.po | 46 +++++++++++++++++++ 7 files changed, 316 insertions(+) create mode 100644 mail_optional_follower_notification/i18n/ca.po create mode 100644 mail_optional_follower_notification/i18n/de.po create mode 100644 mail_optional_follower_notification/i18n/en.po create mode 100644 mail_optional_follower_notification/i18n/es.po create mode 100644 mail_optional_follower_notification/i18n/es_CO.po create mode 100644 mail_optional_follower_notification/i18n/pt_BR.po create mode 100644 mail_optional_follower_notification/i18n/sl.po diff --git a/mail_optional_follower_notification/i18n/ca.po b/mail_optional_follower_notification/i18n/ca.po new file mode 100644 index 00000000..2889abda --- /dev/null +++ b/mail_optional_follower_notification/i18n/ca.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: Catalan (http://www.transifex.com/oca/OCA-social-8-0/language/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistent per composició de correus electrònics" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Missatge" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "" diff --git a/mail_optional_follower_notification/i18n/de.po b/mail_optional_follower_notification/i18n/de.po new file mode 100644 index 00000000..460d58dd --- /dev/null +++ b/mail_optional_follower_notification/i18n/de.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: German (http://www.transifex.com/oca/OCA-social-8-0/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistent zum Email verfassen" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Nachricht" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "" diff --git a/mail_optional_follower_notification/i18n/en.po b/mail_optional_follower_notification/i18n/en.po new file mode 100644 index 00000000..31d8f26a --- /dev/null +++ b/mail_optional_follower_notification/i18n/en.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: English (http://www.transifex.com/oca/OCA-social-8-0/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "- Warning : Followers will not be notified but they can access the notification directly from the document (if they are allowed to)" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Email composition wizard" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Message" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "Notifications" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "Notify followers" diff --git a/mail_optional_follower_notification/i18n/es.po b/mail_optional_follower_notification/i18n/es.po new file mode 100644 index 00000000..122a99fc --- /dev/null +++ b/mail_optional_follower_notification/i18n/es.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: Spanish (http://www.transifex.com/oca/OCA-social-8-0/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Asistente composición Correo Electrónico" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Mensaje" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "Notificaciones" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "" diff --git a/mail_optional_follower_notification/i18n/es_CO.po b/mail_optional_follower_notification/i18n/es_CO.po new file mode 100644 index 00000000..5d3380a9 --- /dev/null +++ b/mail_optional_follower_notification/i18n/es_CO.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/oca/OCA-social-8-0/language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Asistente de redacción de E-mail" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Mensaje" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "" diff --git a/mail_optional_follower_notification/i18n/pt_BR.po b/mail_optional_follower_notification/i18n/pt_BR.po new file mode 100644 index 00000000..2321d5ed --- /dev/null +++ b/mail_optional_follower_notification/i18n/pt_BR.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-25 14:10+0000\n" +"Last-Translator: <>\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-social-8-0/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistente de Composição de Email" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Mensagem" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "" diff --git a/mail_optional_follower_notification/i18n/sl.po b/mail_optional_follower_notification/i18n/sl.po new file mode 100644 index 00000000..6942575c --- /dev/null +++ b/mail_optional_follower_notification/i18n/sl.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_optional_follower_notification +# +# Translators: +# Matjaž Mozetič , 2016 +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-26 02:42+0000\n" +"PO-Revision-Date: 2016-05-26 04:13+0000\n" +"Last-Translator: Matjaž Mozetič \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-social-8-0/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: mail_optional_follower_notification +#: view:mail.compose.message:mail_optional_follower_notification.email_compose_message_wizard_inherit_form +msgid "" +"- Warning : Followers will not be notified but they can access the " +"notification directly from the document (if they are allowed to)" +msgstr "- Pozor : Sledilci ne bodo obveščeni, lahko pa neposredno dostopajo do obvestila v dokumentu (če za to imajo pravice)" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Čarovnik za sestavljanje e-pošte" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_message +msgid "Message" +msgstr "Sporočilo" + +#. module: mail_optional_follower_notification +#: model:ir.model,name:mail_optional_follower_notification.model_mail_notification +msgid "Notifications" +msgstr "Obvestila" + +#. module: mail_optional_follower_notification +#: field:mail.compose.message,notify_followers:0 +msgid "Notify followers" +msgstr "Obvesti sledilce" From f38d1d091d5f3b9414da5dc29ac30c10e9595b9e Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Wed, 25 May 2016 14:12:00 +0200 Subject: [PATCH 03/11] Upgrade version from 8 -> 9 --- mail_optional_follower_notification/README.rst | 5 +++-- mail_optional_follower_notification/__openerp__.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mail_optional_follower_notification/README.rst b/mail_optional_follower_notification/README.rst index 3132e6f0..2e08dc16 100644 --- a/mail_optional_follower_notification/README.rst +++ b/mail_optional_follower_notification/README.rst @@ -25,7 +25,7 @@ This field it's initialized to true to keep the standard behavior. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/205/8.0 + :target: https://runbot.odoo-community.org/runbot/205/9.0 * https://www.odoo.com/forum/help-1 @@ -45,6 +45,7 @@ Contributors ------------ * Adrien Peiffer +* Laurent Mignon Maintainer ---------- @@ -57,4 +58,4 @@ This module is maintained by the OCA. OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. \ No newline at end of file +To contribute to this module, please visit https://odoo-community.org. diff --git a/mail_optional_follower_notification/__openerp__.py b/mail_optional_follower_notification/__openerp__.py index 5421f288..752029ee 100644 --- a/mail_optional_follower_notification/__openerp__.py +++ b/mail_optional_follower_notification/__openerp__.py @@ -11,7 +11,7 @@ 'Odoo Community Association (OCA)', 'website': "http://acsone.eu", 'category': 'Social Network', - 'version': '8.0.1.0.0', + 'version': '9.0.1.0.0', 'license': 'AGPL-3', 'depends': [ 'mail', From f788c886e0d8c5b8fc88c361ba9005ef87e0a234 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Wed, 25 May 2016 15:34:16 +0200 Subject: [PATCH 04/11] mail.notification has been removed. The notify is done directly on the res.partner and channel --- .../models/__init__.py | 2 +- .../models/mail_notification.py | 19 ------------------- .../models/res_partner.py | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 20 deletions(-) delete mode 100644 mail_optional_follower_notification/models/mail_notification.py create mode 100644 mail_optional_follower_notification/models/res_partner.py diff --git a/mail_optional_follower_notification/models/__init__.py b/mail_optional_follower_notification/models/__init__.py index cc213b9f..0c4de321 100644 --- a/mail_optional_follower_notification/models/__init__.py +++ b/mail_optional_follower_notification/models/__init__.py @@ -3,4 +3,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import mail_message -from . import mail_notification +from . import res_partner diff --git a/mail_optional_follower_notification/models/mail_notification.py b/mail_optional_follower_notification/models/mail_notification.py deleted file mode 100644 index 47cf08b6..00000000 --- a/mail_optional_follower_notification/models/mail_notification.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from openerp import models, api - - -class MailNotification(models.Model): - _inherit = 'mail.notification' - - @api.model - def _notify(self, message_id, partners_to_notify=None, - force_send=False, user_signature=True): - if self.env.context.get('force_partners_to_notify'): - partners_to_notify =\ - self.env.context.get('force_partners_to_notify') - super(MailNotification, self)._notify( - message_id, partners_to_notify=partners_to_notify, - force_send=force_send, user_signature=user_signature) diff --git a/mail_optional_follower_notification/models/res_partner.py b/mail_optional_follower_notification/models/res_partner.py new file mode 100644 index 00000000..4c7e53f4 --- /dev/null +++ b/mail_optional_follower_notification/models/res_partner.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, api + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + @api.multi + def _notify(self, message, force_send=False, user_signature=True): + if self.env.context.get('force_partners_to_notify'): + partners_to_notify =\ + self.env.context.get('force_partners_to_notify') + self = self.filtered(lambda p: p.id in partners_to_notify) + super(ResPartner, self)._notify( + message, force_send=False, user_signature=True) From 68efa6c9fadcf41f78205d9f904059950eddba3c Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Mon, 13 Jun 2016 10:12:23 +0200 Subject: [PATCH 05/11] Tests: Replace XML_IDs no more available in 9.0 --- .../tests/test_mail_optional_follower_notifications.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py index 4f128323..1ca61bfb 100644 --- a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py +++ b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py @@ -11,8 +11,8 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): super(TestMailOptionalFollowernotifications, self).setUp() self.partner_obj = self.env['res.partner'] self.partner_01 = self.env.ref('base.res_partner_2') - self.partner_02 = self.env.ref('base.res_partner_13') - self.partner_03 = self.env.ref('base.res_partner_5') + self.partner_02 = self.env.ref('base.res_partner_3') + self.partner_03 = self.env.ref('base.res_partner_4') def test_send_email_optional_follower_notifications(self): ctx = self.env.context.copy() From e881afe63612b0344a3f5b61f93fe057538789bb Mon Sep 17 00:00:00 2001 From: Thomas Binsfeld Date: Fri, 19 Aug 2016 09:40:09 +0200 Subject: [PATCH 06/11] Argument auto_commit in send_mail --- .../wizard/mail_compose_message.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mail_optional_follower_notification/wizard/mail_compose_message.py b/mail_optional_follower_notification/wizard/mail_compose_message.py index b6bc9053..0153bfe6 100644 --- a/mail_optional_follower_notification/wizard/mail_compose_message.py +++ b/mail_optional_follower_notification/wizard/mail_compose_message.py @@ -11,9 +11,10 @@ class MailComposeMessage(models.TransientModel): notify_followers = fields.Boolean(default=True) @api.multi - def send_mail(self): + def send_mail(self, auto_commit=False): for wizard in self: wizard = wizard.with_context( notify_followers=wizard.notify_followers) - super(MailComposeMessage, wizard).send_mail() + super(MailComposeMessage, wizard).send_mail( + auto_commit=auto_commit) return {'type': 'ir.actions.act_window_close'} From 1665bc95ec47a3cf1caa0171e1daf8da18151112 Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Mon, 24 Oct 2016 11:46:07 +0200 Subject: [PATCH 07/11] Migration of mail_optional_follower_notification to 10.0 --- mail_optional_follower_notification/README.rst | 5 ++--- .../{__openerp__.py => __manifest__.py} | 0 .../models/mail_message.py | 14 +++++++++++++- .../models/res_partner.py | 8 +++++--- .../test_mail_optional_follower_notifications.py | 13 +++++++------ .../wizard/mail_compose_message.py | 2 +- .../wizard/mail_compose_message_view.xml | 4 ++-- 7 files changed, 30 insertions(+), 16 deletions(-) rename mail_optional_follower_notification/{__openerp__.py => __manifest__.py} (100%) diff --git a/mail_optional_follower_notification/README.rst b/mail_optional_follower_notification/README.rst index 2e08dc16..0998cc9d 100644 --- a/mail_optional_follower_notification/README.rst +++ b/mail_optional_follower_notification/README.rst @@ -25,7 +25,7 @@ This field it's initialized to true to keep the standard behavior. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/205/9.0 + :target: https://runbot.odoo-community.org/runbot/205/10.0 * https://www.odoo.com/forum/help-1 @@ -35,8 +35,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback. Credits ======= diff --git a/mail_optional_follower_notification/__openerp__.py b/mail_optional_follower_notification/__manifest__.py similarity index 100% rename from mail_optional_follower_notification/__openerp__.py rename to mail_optional_follower_notification/__manifest__.py diff --git a/mail_optional_follower_notification/models/mail_message.py b/mail_optional_follower_notification/models/mail_message.py index fe64abc0..4768bb81 100644 --- a/mail_optional_follower_notification/models/mail_message.py +++ b/mail_optional_follower_notification/models/mail_message.py @@ -2,7 +2,7 @@ # Copyright 2016 ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, api +from odoo import models, api class MailMessage(models.Model): @@ -17,3 +17,15 @@ class MailMessage(models.Model): force_partners_to_notify = [d['id'] for d in partner_list] ctx['force_partners_to_notify'] = force_partners_to_notify return super(MailMessage, self.with_context(ctx)).create(values) + + @api.multi + def _notify(self, force_send=False, send_after_commit=True, + user_signature=True): + res = super(MailMessage, self)._notify( + force_send=force_send, send_after_commit=send_after_commit, + user_signature=user_signature) + if not self.env.context.get('notify_followers'): + # Needaction only for recipients + self.needaction_partner_ids = [(6, 0, self.partner_ids.ids)] + return res + diff --git a/mail_optional_follower_notification/models/res_partner.py b/mail_optional_follower_notification/models/res_partner.py index 4c7e53f4..f32d9bb0 100644 --- a/mail_optional_follower_notification/models/res_partner.py +++ b/mail_optional_follower_notification/models/res_partner.py @@ -2,17 +2,19 @@ # Copyright 2016 ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, api +from odoo import models, api class ResPartner(models.Model): _inherit = 'res.partner' @api.multi - def _notify(self, message, force_send=False, user_signature=True): + def _notify(self, message, force_send=False, send_after_commit=True, + user_signature=True): if self.env.context.get('force_partners_to_notify'): partners_to_notify =\ self.env.context.get('force_partners_to_notify') self = self.filtered(lambda p: p.id in partners_to_notify) super(ResPartner, self)._notify( - message, force_send=False, user_signature=True) + message, force_send=force_send, + send_after_commit=send_after_commit, user_signature=user_signature) diff --git a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py index 1ca61bfb..91936728 100644 --- a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py +++ b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py @@ -2,7 +2,7 @@ # Copyright 2016 ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.tests import common +from odoo.tests import common class TestMailOptionalFollowernotifications(common.TransactionCase): @@ -11,8 +11,8 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): super(TestMailOptionalFollowernotifications, self).setUp() self.partner_obj = self.env['res.partner'] self.partner_01 = self.env.ref('base.res_partner_2') - self.partner_02 = self.env.ref('base.res_partner_3') - self.partner_03 = self.env.ref('base.res_partner_4') + self.demo_user = self.env.ref('base.user_demo') + self.partner_03 = self.demo_user.copy().partner_id def test_send_email_optional_follower_notifications(self): ctx = self.env.context.copy() @@ -22,10 +22,11 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): 'default_composition_mode': 'comment', }) mail_compose = self.env['mail.compose.message'] + self.partner_01.message_subscribe_users(user_ids=[self.demo_user.id]) values = mail_compose.with_context(ctx)\ .onchange_template_id(False, 'comment', 'res.partner', self.partner_01.id)['value'] - values['partner_ids'] = [(4, self.partner_02.id), + values['partner_ids'] = [(4, self.demo_user.partner_id.id), (4, self.partner_03.id)] compose_id = mail_compose.with_context(ctx).create(values) compose_id.with_context(ctx).send_mail() @@ -35,7 +36,7 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): self.assertEqual(len(res.ids), 1) message = self.env['mail.message'] for record in res: - if record.notified_partner_ids.ids == [self.partner_03.id] and\ + if record.notification_ids.mapped('res_partner_id').ids == [self.partner_03.id] and\ record.partner_ids.ids == [self.partner_03.id]: message += record self.assertEqual(len(message.ids), 0) @@ -48,7 +49,7 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): ('res_id', '=', self.partner_01.id)]) message = self.env['mail.message'] for record in res: - if record.notified_partner_ids.ids == [self.partner_03.id] and\ + if record.notification_ids.mapped('res_partner_id').ids == [self.partner_03.id] and\ record.partner_ids.ids == [self.partner_03.id]: message += record self.assertEqual(len(message.ids), 1) diff --git a/mail_optional_follower_notification/wizard/mail_compose_message.py b/mail_optional_follower_notification/wizard/mail_compose_message.py index 0153bfe6..d90bb4b7 100644 --- a/mail_optional_follower_notification/wizard/mail_compose_message.py +++ b/mail_optional_follower_notification/wizard/mail_compose_message.py @@ -2,7 +2,7 @@ # Copyright 2016 ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api +from odoo import models, fields, api class MailComposeMessage(models.TransientModel): diff --git a/mail_optional_follower_notification/wizard/mail_compose_message_view.xml b/mail_optional_follower_notification/wizard/mail_compose_message_view.xml index 62078101..b4ba5194 100644 --- a/mail_optional_follower_notification/wizard/mail_compose_message_view.xml +++ b/mail_optional_follower_notification/wizard/mail_compose_message_view.xml @@ -1,5 +1,5 @@ - + mail.compose.message.form (mail_optional_autofollow) @@ -15,4 +15,4 @@ - \ No newline at end of file + \ No newline at end of file From c7f453af161bb86a4a2707554347bf770ba494f1 Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Mon, 24 Oct 2016 11:49:14 +0200 Subject: [PATCH 08/11] [ADD] Add setup.py --- .../odoo_addons/__init__.py | 1 + .../odoo_addons/mail_optional_follower_notification | 1 + setup/mail_optional_follower_notification/setup.py | 6 ++++++ 3 files changed, 8 insertions(+) create mode 100644 setup/mail_optional_follower_notification/odoo_addons/__init__.py create mode 120000 setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification create mode 100644 setup/mail_optional_follower_notification/setup.py diff --git a/setup/mail_optional_follower_notification/odoo_addons/__init__.py b/setup/mail_optional_follower_notification/odoo_addons/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/setup/mail_optional_follower_notification/odoo_addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification b/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification new file mode 120000 index 00000000..f8435d2b --- /dev/null +++ b/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification @@ -0,0 +1 @@ +../../../mail_optional_follower_notification \ No newline at end of file diff --git a/setup/mail_optional_follower_notification/setup.py b/setup/mail_optional_follower_notification/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/mail_optional_follower_notification/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From b298043d1ff3305e78a5d192a0226d3b0b21b542 Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Mon, 24 Oct 2016 12:10:45 +0200 Subject: [PATCH 09/11] [FIX] Bad version --- mail_optional_follower_notification/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail_optional_follower_notification/__manifest__.py b/mail_optional_follower_notification/__manifest__.py index 752029ee..848dc736 100644 --- a/mail_optional_follower_notification/__manifest__.py +++ b/mail_optional_follower_notification/__manifest__.py @@ -11,7 +11,7 @@ 'Odoo Community Association (OCA)', 'website': "http://acsone.eu", 'category': 'Social Network', - 'version': '9.0.1.0.0', + 'version': '10.0.1.0.0', 'license': 'AGPL-3', 'depends': [ 'mail', From 891394cc65066a90eecb92a3b15c612888c940d5 Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Mon, 24 Oct 2016 13:56:09 +0200 Subject: [PATCH 10/11] [FIX] Bad setup package --- .../{odoo_addons => odoo}/__init__.py | 0 .../mail_optional_follower_notification/odoo/addons/__init__.py | 1 + .../odoo/addons/mail_optional_follower_notification | 1 + .../odoo_addons/mail_optional_follower_notification | 1 - 4 files changed, 2 insertions(+), 1 deletion(-) rename setup/mail_optional_follower_notification/{odoo_addons => odoo}/__init__.py (100%) create mode 100644 setup/mail_optional_follower_notification/odoo/addons/__init__.py create mode 120000 setup/mail_optional_follower_notification/odoo/addons/mail_optional_follower_notification delete mode 120000 setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification diff --git a/setup/mail_optional_follower_notification/odoo_addons/__init__.py b/setup/mail_optional_follower_notification/odoo/__init__.py similarity index 100% rename from setup/mail_optional_follower_notification/odoo_addons/__init__.py rename to setup/mail_optional_follower_notification/odoo/__init__.py diff --git a/setup/mail_optional_follower_notification/odoo/addons/__init__.py b/setup/mail_optional_follower_notification/odoo/addons/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/setup/mail_optional_follower_notification/odoo/addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/mail_optional_follower_notification/odoo/addons/mail_optional_follower_notification b/setup/mail_optional_follower_notification/odoo/addons/mail_optional_follower_notification new file mode 120000 index 00000000..95258400 --- /dev/null +++ b/setup/mail_optional_follower_notification/odoo/addons/mail_optional_follower_notification @@ -0,0 +1 @@ +../../../../mail_optional_follower_notification \ No newline at end of file diff --git a/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification b/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification deleted file mode 120000 index f8435d2b..00000000 --- a/setup/mail_optional_follower_notification/odoo_addons/mail_optional_follower_notification +++ /dev/null @@ -1 +0,0 @@ -../../../mail_optional_follower_notification \ No newline at end of file From f8e683a8c8133b52e3c700842e3bb5c46aecd8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul=20=28ACSONE=29?= Date: Mon, 26 Dec 2016 14:55:56 +0100 Subject: [PATCH 11/11] [FIX] pep8 --- mail_optional_follower_notification/models/mail_message.py | 3 +-- .../tests/test_mail_optional_follower_notifications.py | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mail_optional_follower_notification/models/mail_message.py b/mail_optional_follower_notification/models/mail_message.py index 4768bb81..84666b68 100644 --- a/mail_optional_follower_notification/models/mail_message.py +++ b/mail_optional_follower_notification/models/mail_message.py @@ -26,6 +26,5 @@ class MailMessage(models.Model): user_signature=user_signature) if not self.env.context.get('notify_followers'): # Needaction only for recipients - self.needaction_partner_ids = [(6, 0, self.partner_ids.ids)] + self.needaction_partner_ids = [(6, 0, self.partner_ids.ids)] return res - diff --git a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py index 91936728..67b26aff 100644 --- a/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py +++ b/mail_optional_follower_notification/tests/test_mail_optional_follower_notifications.py @@ -36,7 +36,8 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): self.assertEqual(len(res.ids), 1) message = self.env['mail.message'] for record in res: - if record.notification_ids.mapped('res_partner_id').ids == [self.partner_03.id] and\ + if record.notification_ids.mapped('res_partner_id').ids == \ + [self.partner_03.id] and \ record.partner_ids.ids == [self.partner_03.id]: message += record self.assertEqual(len(message.ids), 0) @@ -49,7 +50,8 @@ class TestMailOptionalFollowernotifications(common.TransactionCase): ('res_id', '=', self.partner_01.id)]) message = self.env['mail.message'] for record in res: - if record.notification_ids.mapped('res_partner_id').ids == [self.partner_03.id] and\ + if record.notification_ids.mapped('res_partner_id').ids == \ + [self.partner_03.id] and\ record.partner_ids.ids == [self.partner_03.id]: message += record self.assertEqual(len(message.ids), 1)