diff --git a/mail_all/__init__.py b/mail_all/__init__.py index 40a96af..e69de29 100644 --- a/mail_all/__init__.py +++ b/mail_all/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/mail_all/__openerp__.py b/mail_all/__openerp__.py index 0d78721..1ffed98 100644 --- a/mail_all/__openerp__.py +++ b/mail_all/__openerp__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- { "name": "Show all messages", "summary": """Checkout all messages where you have access""", "category": "Discuss", # "live_test_url": "", "images": ['images/1.jpg'], - "version": "1.0.0", + "version": "11.0.1.0.0", "application": False, "author": "IT-Projects LLC, Pavel Romanchenko", diff --git a/mail_all/i18n/es.po b/mail_all/i18n/es.po new file mode 100644 index 0000000..bc912ed --- /dev/null +++ b/mail_all/i18n/es.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_all +# +# Translators: +# Randall Castro , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 23:07+0000\n" +"PO-Revision-Date: 2018-04-21 23:07+0000\n" +"Last-Translator: Randall Castro , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/teams/76080/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_all +#. openerp-web +#: code:addons/mail_all/static/src/js/mail_all.js:49 +#: code:addons/mail_all/static/src/xml/menu.xml:7 +#, python-format +msgid "All messages" +msgstr "Todos los mensajes" + +#. module: mail_all +#. openerp-web +#: code:addons/mail_all/static/src/xml/menu.xml:15 +#, python-format +msgid "No messages" +msgstr "Sin mensajes" diff --git a/mail_all/tests/__init__.py b/mail_all/tests/__init__.py index cadc614..a43ec20 100644 --- a/mail_all/tests/__init__.py +++ b/mail_all/tests/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from . import test_js diff --git a/mail_all/tests/test_js.py b/mail_all/tests/test_js.py index f001c6b..da8cf40 100644 --- a/mail_all/tests/test_js.py +++ b/mail_all/tests/test_js.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import odoo.tests diff --git a/mail_archives/__init__.py b/mail_archives/__init__.py index 40a96af..e69de29 100644 --- a/mail_archives/__init__.py +++ b/mail_archives/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/mail_archives/__openerp__.py b/mail_archives/__openerp__.py index 8dd83b3..ca430d2 100644 --- a/mail_archives/__openerp__.py +++ b/mail_archives/__openerp__.py @@ -1,10 +1,9 @@ -# -*- coding: utf-8 -*- { "name": "Mail archives", "summary": """Adds menu to find old messages""", "category": "Discuss", "images": ['images/1.jpg'], - "version": "1.0.0", + "version": "11.0.1.0.0", "author": "IT-Projects LLC, Pavel Romanchenko", "support": "apps@it-projects.info", diff --git a/mail_archives/i18n/es.po b/mail_archives/i18n/es.po new file mode 100644 index 0000000..0ebdd2a --- /dev/null +++ b/mail_archives/i18n/es.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_archives +# +# Translators: +# Randall Castro , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 23:07+0000\n" +"PO-Revision-Date: 2018-04-21 23:07+0000\n" +"Last-Translator: Randall Castro , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/teams/76080/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_archives +#. openerp-web +#: code:addons/mail_archives/static/src/js/archives.js:68 +#: code:addons/mail_archives/static/src/xml/menu.xml:7 +#, python-format +msgid "Archive" +msgstr "Archivo" + +#. module: mail_archives +#. openerp-web +#: code:addons/mail_archives/static/src/xml/menu.xml:15 +#, python-format +msgid "Archive is empty" +msgstr "Archivo está vacío" diff --git a/mail_archives/tests/__init__.py b/mail_archives/tests/__init__.py index cadc614..a43ec20 100644 --- a/mail_archives/tests/__init__.py +++ b/mail_archives/tests/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from . import test_js diff --git a/mail_archives/tests/test_js.py b/mail_archives/tests/test_js.py index ecb0384..e8f9457 100644 --- a/mail_archives/tests/test_js.py +++ b/mail_archives/tests/test_js.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import odoo.tests diff --git a/mail_base/__init__.py b/mail_base/__init__.py index c3d410e..7cdad7f 100644 --- a/mail_base/__init__.py +++ b/mail_base/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from . import models from . import controllers diff --git a/mail_base/__openerp__.py b/mail_base/__openerp__.py index ce01512..e286f80 100644 --- a/mail_base/__openerp__.py +++ b/mail_base/__openerp__.py @@ -1,10 +1,9 @@ -# -*- coding: utf-8 -*- { "name": "Mail Base", "summary": """Makes Mail extendable""", "category": "Discuss", "images": [], - "version": "1.0.2", + "version": "11.0.1.0.2", "author": "IT-Projects LLC, Pavel Romanchenko", "support": "apps@it-projects.info", diff --git a/mail_base/controllers/main.py b/mail_base/controllers/main.py index 06f8695..a7d27f7 100644 --- a/mail_base/controllers/main.py +++ b/mail_base/controllers/main.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from openerp.http import request from openerp.addons.bus.controllers.main import BusController diff --git a/mail_base/i18n/es.po b/mail_base/i18n/es.po new file mode 100644 index 0000000..c2e5a92 --- /dev/null +++ b/mail_base/i18n/es.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_base +# +# Translators: +# Randall Castro , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 23:07+0000\n" +"PO-Revision-Date: 2018-04-21 23:07+0000\n" +"Last-Translator: Randall Castro , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/teams/76080/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_base +#: model:ir.model,name:mail_base.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Asistente para composición de correo" + +#. module: mail_base +#: model:ir.model,name:mail_base.model_mail_message +msgid "Message" +msgstr "Mensaje" diff --git a/mail_base/i18n/pt.po b/mail_base/i18n/pt.po new file mode 100644 index 0000000..cb7b24e --- /dev/null +++ b/mail_base/i18n/pt.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_base +# +# Translators: +# Translation Bot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:05+0000\n" +"PO-Revision-Date: 2018-04-21 00:05+0000\n" +"Last-Translator: Translation Bot , 2018\n" +"Language-Team: Portuguese (https://www.transifex.com/it-projects-llc/teams/76080/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mail_base +#: model:ir.model,name:mail_base.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistente de composição de Email" + +#. module: mail_base +#: model:ir.model,name:mail_base.model_mail_message +msgid "Message" +msgstr "Mensagem" diff --git a/mail_base/i18n/pt_BR.po b/mail_base/i18n/pt_BR.po new file mode 100644 index 0000000..9a74270 --- /dev/null +++ b/mail_base/i18n/pt_BR.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_base +# +# Translators: +# Translation Bot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-21 00:05+0000\n" +"PO-Revision-Date: 2018-04-21 00:05+0000\n" +"Last-Translator: Translation Bot , 2018\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/it-projects-llc/teams/76080/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_base +#: model:ir.model,name:mail_base.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Assistente de Composição de Email" + +#. module: mail_base +#: model:ir.model,name:mail_base.model_mail_message +msgid "Message" +msgstr "Mensagem" diff --git a/mail_base/models.py b/mail_base/models.py index 953f49f..9bdf491 100644 --- a/mail_base/models.py +++ b/mail_base/models.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from openerp import api, models diff --git a/mail_base/static/lib/base.js b/mail_base/static/lib/base.js index 2cbcf81..42433e7 100644 --- a/mail_base/static/lib/base.js +++ b/mail_base/static/lib/base.js @@ -877,6 +877,12 @@ chat_manager.post_message = function (data, options) { attachment_ids: data.attachment_ids, }; + // for module mail_private + if (data.is_private) { + msg.is_private = data.is_private; + msg.channel_ids = data.channel_ids; + } + // Replace emojis by their unicode character _.each(_.keys(emoji_unicodes), function (key) { var escaped_key = String(key).replace(/([.*+?=^!:${}()|[\]\/\\])/g, '\\$1'); diff --git a/mail_base/tests/__init__.py b/mail_base/tests/__init__.py index 589cffd..8f6e743 100644 --- a/mail_base/tests/__init__.py +++ b/mail_base/tests/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from . import test_default diff --git a/mail_base/tests/test_default.py b/mail_base/tests/test_default.py index ca0614c..ba99163 100644 --- a/mail_base/tests/test_default.py +++ b/mail_base/tests/test_default.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import odoo.tests diff --git a/mail_check_immediately/__init__.py b/mail_check_immediately/__init__.py index a0fdc10..0650744 100644 --- a/mail_check_immediately/__init__.py +++ b/mail_check_immediately/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import models diff --git a/mail_check_immediately/__openerp__.py b/mail_check_immediately/__openerp__.py index 2bfb6a4..621ac88 100644 --- a/mail_check_immediately/__openerp__.py +++ b/mail_check_immediately/__openerp__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- { 'name': 'Check mail immediately', 'version': '1.0.1', diff --git a/mail_check_immediately/models.py b/mail_check_immediately/models.py index 836bdb7..3a07ab4 100644 --- a/mail_check_immediately/models.py +++ b/mail_check_immediately/models.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import datetime from openerp.tools.translate import _ diff --git a/mail_fix_553/__init__.py b/mail_fix_553/__init__.py index e9ad948..169f088 100644 --- a/mail_fix_553/__init__.py +++ b/mail_fix_553/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import mail_fix_553 diff --git a/mail_fix_553/__openerp__.py b/mail_fix_553/__openerp__.py index 46e70f0..adb3140 100644 --- a/mail_fix_553/__openerp__.py +++ b/mail_fix_553/__openerp__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- { "name": "Fix mail error 553", "version": "0.3", diff --git a/mail_fix_553/mail_fix_553.py b/mail_fix_553/mail_fix_553.py index 003af81..a5f474d 100644 --- a/mail_fix_553/mail_fix_553.py +++ b/mail_fix_553/mail_fix_553.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import base64 import logging diff --git a/mail_move_message/README.rst b/mail_move_message/README.rst index 5957d56..f3e420a 100644 --- a/mail_move_message/README.rst +++ b/mail_move_message/README.rst @@ -1,10 +1,49 @@ -Mail relocation -=============== +.. image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: https://www.gnu.org/licenses/lgpl + :alt: License: LGPL-3 -Demo: http://runbot.it-projects.info/demo/mail-addons/9.0 +================= + Mail Relocation +================= -Description: https://www.odoo.com/apps/modules/9.0/mail_move_message/ +The module allows to relocate messages between models + +Credits +======= + +Contributors +------------ +* `Ivan Yelizariev `__ + +Sponsors +-------- +* `IT-Projects LLC `__ + +Maintainers +----------- +* `IT-Projects LLC `__ + + To get a guaranteed support + you are kindly requested to purchase the module + at `odoo apps store `__. + + Thank you for understanding! + + `IT-Projects Team `__ + +Further information +=================== + +Demo: http://runbot.it-projects.info/demo/mail-addons/11.0 + +HTML Description: https://apps.odoo.com/apps/modules/11.0/mail_move_message/ + +Usage instructions: ``_ + +Changelog: ``_ + +Notifications on updates: `via Atom `_, `by Email `_ Further information and discussion: http://yelizariev.github.io/odoo/module/2015/04/10/mail-relocation.html -Tested on Odoo 8.0 d023c079ed86468436f25da613bf486a4a17d625 +Tested on Odoo 11.0 e9454e79e27d0b85546132cbe00b391e974c66bf diff --git a/mail_move_message/__init__.py b/mail_move_message/__init__.py index 9f91a71..da664f4 100644 --- a/mail_move_message/__init__.py +++ b/mail_move_message/__init__.py @@ -1,3 +1,4 @@ -# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + from . import controllers from . import mail_move_message_models diff --git a/mail_move_message/__manifest__.py b/mail_move_message/__manifest__.py new file mode 100644 index 0000000..ebc20bc --- /dev/null +++ b/mail_move_message/__manifest__.py @@ -0,0 +1,30 @@ +# Copyright 2016 Ildar Nasyrov +# Copyright 2017 Ilmir Karamov +# Copyright 2017 Lilia Salihova +# Copyright 2016-2018 Ivan Yelizariev +# Copyright 2018 Kolushov Alexandr +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + 'name': 'Mail Relocation', + 'version': '11.0.1.0.5', + 'author': 'IT-Projects LLC, Ivan Yelizariev, Pavel Romanchenko', + 'license': 'LGPL-3', + 'category': 'Discuss', + 'images': ['images/m1.png'], + "support": "apps@it-projects.info", + 'website': 'https://twitter.com/yelizariev', + 'price': 100.00, + 'currency': 'EUR', + 'depends': [ + 'mail_all', + ], + 'data': [ + 'mail_move_message_views.xml', + 'data/mail_move_message_data.xml', + ], + 'qweb': [ + 'static/src/xml/mail_move_message_main.xml', + ], + 'installable': True, +} diff --git a/mail_move_message/__openerp__.py b/mail_move_message/__openerp__.py deleted file mode 100644 index 29880f0..0000000 --- a/mail_move_message/__openerp__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -{ - 'name': 'Mail relocation', - 'version': '1.0.5', - 'author': 'IT-Projects LLC, Ivan Yelizariev, Pavel Romanchenko', - 'license': 'LGPL-3', - 'category': 'Discuss', - 'images': ['images/m1.png'], - "support": "apps@it-projects.info", - 'website': 'https://twitter.com/yelizariev', - 'price': 100.00, - 'currency': 'EUR', - 'depends': ['mail_all', 'web_polymorphic_field'], - 'data': [ - 'mail_move_message_views.xml', - 'data/mail_move_message_data.xml', - ], - 'qweb': [ - 'static/src/xml/mail_move_message_main.xml', - ], - 'installable': False, -} diff --git a/mail_move_message/controllers/__init__.py b/mail_move_message/controllers/__init__.py index 757b12a..373d38d 100644 --- a/mail_move_message/controllers/__init__.py +++ b/mail_move_message/controllers/__init__.py @@ -1,2 +1,3 @@ -# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + from . import main diff --git a/mail_move_message/controllers/main.py b/mail_move_message/controllers/main.py index bb51fc8..e0974bc 100644 --- a/mail_move_message/controllers/main.py +++ b/mail_move_message/controllers/main.py @@ -1,7 +1,8 @@ -# -*- coding: utf-8 -*- -from odoo.addons.web.controllers.main import DataSet -from odoo.tools.translate import _ -from odoo import http +# Copyright 2016 Ildar Nasyrov +# Copyright 2018 Ivan Yelizariev +# Copyright 2018 Kolushov Alexandr +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + from odoo.http import request from odoo.addons.bus.controllers.main import BusController @@ -16,52 +17,3 @@ class MailChatController(BusController): channels.append((request.db, 'mail_move_message')) channels.append((request.db, 'mail_move_message.delete_message')) return super(MailChatController, self)._poll(dbname, channels, last, options) - - -class DataSetCustom(DataSet): - - def _extend_name(self, model, records): - Model = request.env[model] - fields = Model.fields_get() - contact_field = False - for n, f in fields.iteritems(): - if f['type'] == 'many2one' and f['relation'] == 'res.partner': - contact_field = n - break - partner_info = {} - if contact_field: - partner_info = Model.browse([r[0] for r in records]).read([contact_field]) - partner_info = dict([(p['id'], p[contact_field]) for p in partner_info]) - res = [] - for r in records: - if partner_info.get(r[0]): - res.append((r[0], _('%s [%s] ID %s') % (r[1], partner_info.get(r[0])[1], r[0]))) - else: - res.append((r[0], _('%s ID %s') % (r[1], r[0]))) - return res - - @http.route('/web/dataset/call_kw//name_search', type='json', auth="user") - def name_search(self, model, method, args, kwargs): - context = kwargs.get('context') - if context and context.get('extended_name_with_contact'): - # add order by ID desc - Model = request.env[model] - search_args = list(kwargs.get('args') or []) - limit = int(kwargs.get('limit') or 100) - operator = kwargs.get('operator') - name = kwargs.get('name') - if Model._rec_name and (not name == '' and operator == 'ilike'): - search_args += [(Model._rec_name, operator, name)] - records = Model.search(search_args, limit=limit, order='id desc') - res = records.name_get() - return self._extend_name(model, res) - - return self._call_kw(model, method, args, kwargs) - - @http.route('/web/dataset/call_kw//name_get', type='json', auth="user") - def name_get(self, model, method, args, kwargs): - res = self._call_kw(model, method, args, kwargs) - context = kwargs.get('context') - if context and context.get('extended_name_with_contact'): - res = self._extend_name(model, res) - return res diff --git a/mail_move_message/data/mail_move_message_data.xml b/mail_move_message/data/mail_move_message_data.xml index f63eaae..9131606 100644 --- a/mail_move_message/data/mail_move_message_data.xml +++ b/mail_move_message/data/mail_move_message_data.xml @@ -1,4 +1,8 @@ + + diff --git a/mail_move_message/doc/index.rst b/mail_move_message/doc/index.rst new file mode 100644 index 0000000..8d3d134 --- /dev/null +++ b/mail_move_message/doc/index.rst @@ -0,0 +1,35 @@ +================= + Mail Relocation +================= + +Installation +============ + +* `Install `__ this module in a usual way + +Configuration +============= + +* Open ``[[ Settings ]] >> Mail Relocation`` menu +* In **Model** field add models to be used for message relocation +* Check the box **[x] Move Followers** to move followers by default when relocation + +Usage +===== + +Move message +------------ + +* Open ``[[ Discuss ]] >> Inbox`` menu +* Click on icon of two cross arrows +* Select a record you need +* Click **Move** +RESULT: The message has been moved to the record selected. + +Move to origin +-------------- + +* Open the record where the message was moved to +* Click on the two cross arrows icon highlighted as red +* Check the box **[x] Move to origin** +RESULT: The message has been returned back to the original record. diff --git a/mail_move_message/mail_move_message_models.py b/mail_move_message/mail_move_message_models.py index 6732e83..21bde78 100644 --- a/mail_move_message/mail_move_message_models.py +++ b/mail_move_message/mail_move_message_models.py @@ -1,20 +1,27 @@ -# -*- coding: utf-8 -*- -from openerp import api -from openerp import fields -from openerp import models -from openerp.tools import email_split -from openerp.tools.translate import _ +# Copyright 2016 Ildar Nasyrov +# Copyright 2016-2018 Ivan Yelizariev +# Copyright 2016 intero-chz +# Copyright 2016 manawi +# Copyright 2018 Kolushov Alexandr +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api +from odoo import fields +from odoo import models +from odoo.tools import email_split +from odoo.tools.translate import _ +from odoo import exceptions class Wizard(models.TransientModel): _name = 'mail_move_message.wizard' + @api.model def _model_selection(self): selection = [] config_parameters = self.env['ir.config_parameter'] - model_names = config_parameters.get_param('mail_relocation_models') + model_names = config_parameters.sudo().get_param('mail_relocation_models') model_names = model_names.split(',') if model_names else [] - if 'default_message_id' in self.env.context: message = self.env['mail.message'].browse(self.env.context['default_message_id']) if message.model and message.model not in model_names: @@ -23,16 +30,16 @@ class Wizard(models.TransientModel): model_names.append(message.moved_from_model) if model_names: selection = [(m.model, m.display_name) for m in self.env['ir.model'].search([('model', 'in', model_names)])] - return selection @api.model def default_get(self, fields_list): res = super(Wizard, self).default_get(fields_list) - model_fields = self.fields_get() - if model_fields['model']['selection']: - res['model'] = model_fields['model']['selection'] and model_fields['model']['selection'][0][0] + available_models = self._model_selection() + if len(available_models): + record = self.env[available_models[0][0]].search([], limit=1) + res['model_record'] = len(record) and (available_models[0][0] + ',' + str(record.id)) or False if 'message_id' in res: message = self.env['mail.message'].browse(res['message_id']) @@ -55,10 +62,9 @@ class Wizard(models.TransientModel): res['res_id'] = res_id[0].id config_parameters = self.env['ir.config_parameter'] - res['move_followers'] = config_parameters.get_param('mail_relocation_move_followers') + res['move_followers'] = config_parameters.sudo().get_param('mail_relocation_move_followers') res['uid'] = self.env.uid - return res message_id = fields.Many2one('mail.message', string='Message') @@ -69,16 +75,19 @@ class Wizard(models.TransientModel): message_moved_by_user_id = fields.Many2one('res.users', related='message_id.moved_by_user_id', string='Moved by', readonly=True) message_is_moved = fields.Boolean(string='Is Moved', related='message_id.is_moved', readonly=True) parent_id = fields.Many2one('mail.message', string='Search by name', ) - model = fields.Selection(_model_selection, string='Model') - res_id = fields.Integer(string='Record') - can_move = fields.Boolean('Can move', compute='get_can_move') + model_record = fields.Reference(selection="_model_selection", string='Record') + model = fields.Char(compute="_compute_model_res_id", string='Model') + res_id = fields.Integer(compute="_compute_model_res_id", string='Record') + + can_move = fields.Boolean('Can move', compute='_compute_get_can_move') move_back = fields.Boolean('MOVE TO ORIGIN', help='Move message and submessages to original place') partner_id = fields.Many2one('res.partner', string='Author') filter_by_partner = fields.Boolean('Filter Records by partner') message_email_from = fields.Char() message_name_from = fields.Char() # FIXME message_to_read should be True even if current message or any his childs are unread - message_to_read = fields.Boolean(related='message_id.needaction') + message_to_read = fields.Boolean(compute='_compute_is_read', string="Unread message", + help="Service field shows that this message were unread when moved") uid = fields.Integer() move_followers = fields.Boolean( 'Move Followers', @@ -86,12 +95,24 @@ class Wizard(models.TransientModel): "You must use this option, if new record has restricted access.\n" "You can change default value for this option at Settings/System Parameters") + @api.multi + @api.depends('model_record') + def _compute_model_res_id(self): + for rec in self: + rec.model = rec.model_record and rec.model_record._name or False + rec.res_id = rec.model_record and rec.model_record.id or False + @api.depends('message_id') @api.multi - def get_can_move(self): + def _compute_get_can_move(self): for r in self: r.get_can_move_one() + @api.multi + def _compute_is_read(self): + messages = self.env['mail.message'].sudo().browse(self.message_id.all_child_ids.ids + [self.message_id.id]) + self.message_to_read = True in [m.needaction for m in messages] + @api.multi def get_can_move_one(self): self.ensure_one() @@ -103,12 +124,11 @@ class Wizard(models.TransientModel): if not self.move_back: return self.parent_id = self.message_id.moved_from_parent_id - model = self.message_id.moved_from_model - if self.message_id.is_moved: - self.model = model - self.res_id = self.message_id.moved_from_res_id + message = self.message_id + if message.is_moved: + self.model_record = self.env[message.moved_from_model].browse(message.moved_from_res_id) - @api.onchange('parent_id', 'res_id', 'model') + @api.onchange('parent_id', 'model_record') def update_move_back(self): model = self.message_id.moved_from_model self.move_back = self.parent_id == self.message_id.moved_from_parent_id \ @@ -130,7 +150,7 @@ class Wizard(models.TransientModel): if self.model and self.filter_by_partner and self.partner_id: fields = self.env[self.model].fields_get(False) contact_field = False - for n, f in fields.iteritems(): + for n, f in fields.items(): if f['type'] == 'many2one' and f['relation'] == 'res.partner': contact_field = n break @@ -179,6 +199,10 @@ class Wizard(models.TransientModel): @api.multi def move(self): + for r in self: + if not r.model: + raise exceptions.except_orm(_('Record field is empty!'), _('Select a record for relocation first')) + for r in self: r.check_access() if not r.parent_id or not (r.parent_id.model == r.model and @@ -186,15 +210,14 @@ class Wizard(models.TransientModel): # link with the first message of record parent = self.env['mail.message'].search([('model', '=', r.model), ('res_id', '=', r.res_id)], order='id', limit=1) r.parent_id = parent.id or None + r.message_id.move(r.parent_id.id, r.res_id, r.model, r.move_back, r.move_followers, r.message_to_read) - r.message_id.move(r.parent_id.id, r.res_id, r.model, r.move_back, r.move_followers) - - if not (r.model and r.res_id): - r.message_id.needaction = False + if r.model in ['mail.message', 'mail.channel', False]: return { - 'type': 'ir.actions.client', - 'name': 'All messages', - 'tag': 'reload', + 'name': 'Chess game page', + 'type': 'ir.actions.act_url', + 'url': '/web', + 'target': 'self', } return { 'name': _('Record'), @@ -239,7 +262,7 @@ class Wizard(models.TransientModel): fields = model.fields_get() contact_field = False - for n, f in fields.iteritems(): + for n, f in fields.items(): if f['type'] == 'many2one' and f['relation'] == 'res.partner': contact_field = n break @@ -269,10 +292,11 @@ class MailMessage(models.Model): moved_from_parent_id = fields.Many2one('mail.message', 'Parent Message (Original)', ondelete='set null') moved_by_message_id = fields.Many2one('mail.message', 'Moved by message', ondelete='set null', help='Top message, that initate moving this message') moved_by_user_id = fields.Many2one('res.users', 'Moved by user', ondelete='set null') - all_child_ids = fields.One2many('mail.message', string='All childs', compute='_get_all_childs', help='all childs, including subchilds') + all_child_ids = fields.One2many('mail.message', string='All childs', compute='_compute_get_all_childs', help='all childs, including subchilds') + moved_as_unread = fields.Boolean('Was Unread', default=False) @api.multi - def _get_all_childs(self, include_myself=True): + def _compute_get_all_childs(self, include_myself=True): for r in self: r._get_all_childs_one(include_myself=include_myself) @@ -301,12 +325,12 @@ class MailMessage(models.Model): self.env[model].browse(ids).message_subscribe([f.partner_id.id], [s.id for s in f.subtype_ids]) @api.multi - def move(self, parent_id, res_id, model, move_back, move_followers=False): + def move(self, parent_id, res_id, model, move_back, move_followers=False, message_to_read=False): for r in self: - r.move_one(parent_id, res_id, model, move_back, move_followers=move_followers) + r.move_one(parent_id, res_id, model, move_back, move_followers=move_followers, message_to_read=message_to_read) @api.multi - def move_one(self, parent_id, res_id, model, move_back, move_followers=False): + def move_one(self, parent_id, res_id, model, move_back, move_followers=False, message_to_read=False): self.ensure_one() if parent_id == self.id: # if for any reason method is called to move message with parent @@ -323,6 +347,7 @@ class MailMessage(models.Model): vals['moved_from_res_id'] = None vals['moved_from_model'] = None vals['moved_from_parent_id'] = None + vals['moved_as_unread'] = None else: vals['parent_id'] = parent_id vals['res_id'] = res_id @@ -331,22 +356,34 @@ class MailMessage(models.Model): vals['is_moved'] = True vals['moved_by_user_id'] = self.env.user.id vals['moved_by_message_id'] = self.id - - # Update record_name in message - vals['record_name'] = self._get_record_name(vals) + vals['moved_as_unread'] = message_to_read + # Update record_name in message + vals['record_name'] = self._get_record_name(vals) + + # unread message remains unread after moving back to origin + if self.moved_as_unread and move_back: + notification = { + 'mail_message_id': self.id, + 'res_partner_id': self.env.user.partner_id.id, + 'is_read': False, + } + self.write({ + 'notification_ids': [(0, 0, notification)], + }) for r in self.all_child_ids: r_vals = vals.copy() if not r.is_moved: # moved_from_* variables contain not last, but original # reference - r_vals['moved_from_parent_id'] = r.parent_id.id - r_vals['moved_from_res_id'] = r.res_id - r_vals['moved_from_model'] = r.model + r_vals['moved_from_parent_id'] = r.parent_id.id or r.env.context.get('uid') + r_vals['moved_from_res_id'] = r.res_id or r.id + r_vals['moved_from_model'] = r.model or r._name elif move_back: r_vals['parent_id'] = r.moved_from_parent_id.id r_vals['res_id'] = r.moved_from_res_id - r_vals['model'] = r.moved_from_model + r_vals['model'] = (r.moved_from_model and r.moved_from_model not in ['mail.message', 'mail.channel', False]) and r.moved_from_model + r_vals['record_name'] = r_vals['model'] and self.env[r.moved_from_model].browse(r.moved_from_res_id).name if move_followers: r.sudo().move_followers(r_vals.get('model'), r_vals.get('res_id')) @@ -362,7 +399,7 @@ class MailMessage(models.Model): 'res_id': vals.get('res_id'), 'model': vals.get('model'), 'is_moved': vals['is_moved'], - 'record_name': vals['record_name'] + 'record_name': 'record_name' in vals and vals['record_name'], } self.env['bus.bus'].sendone((self._cr.dbname, 'mail_move_message'), notification) @@ -391,34 +428,32 @@ class MailMessage(models.Model): class MailMoveMessageConfiguration(models.TransientModel): - _name = 'mail_move_message.config.settings' _inherit = 'res.config.settings' model_ids = fields.Many2many(comodel_name='ir.model', string='Models') move_followers = fields.Boolean('Move Followers') @api.model - def get_default_move_message_configs(self, fields): - config_parameters = self.env['ir.config_parameter'] - model_obj = self.env['ir.model'] - model_names = config_parameters.get_param('mail_relocation_models') - if not model_names: - return {} + def get_values(self): + res = super(MailMoveMessageConfiguration, self).get_values() + config_parameters = self.env["ir.config_parameter"].sudo() + model_names = config_parameters.sudo().get_param('mail_relocation_models') model_names = model_names.split(',') - model_ids = model_obj.search([('model', 'in', model_names)]) - return { - 'model_ids': [m.id for m in model_ids], - 'move_followers': config_parameters.get_param('mail_relocation_move_followers') - } + model_ids = self.env['ir.model'].sudo().search([('model', 'in', model_names)]) + res.update( + model_ids=[m.id for m in model_ids], + move_followers=config_parameters.sudo().get_param('mail_relocation_move_followers'), + ) + return res @api.multi - def set_move_message_configs(self): - config_parameters = self.env['ir.config_parameter'] - model_names = '' + def set_values(self): + super(MailMoveMessageConfiguration, self).set_values() + config_parameters = self.env["ir.config_parameter"].sudo() for record in self: - model_names = ','.join([m.model for m in record.model_ids]) - config_parameters.set_param('mail_relocation_models', model_names) - config_parameters.set_param('mail_relocation_move_followers', record.move_followers or '') + model_names = ','.join([x.model for x in record.model_ids]) + config_parameters.set_param("mail_relocation_models", model_names or '') + config_parameters.set_param("mail_relocation_move_followers", record.move_followers or '') class ResPartner(models.Model): diff --git a/mail_move_message/mail_move_message_views.xml b/mail_move_message/mail_move_message_views.xml index 7695d8c..5e90c43 100644 --- a/mail_move_message/mail_move_message_views.xml +++ b/mail_move_message/mail_move_message_views.xml @@ -1,5 +1,10 @@ - + + +