diff --git a/base_search_mail_content/README.rst b/base_search_mail_content/README.rst index 5934ec02..276c6ff0 100644 --- a/base_search_mail_content/README.rst +++ b/base_search_mail_content/README.rst @@ -17,7 +17,7 @@ associated, based on the feedback that the person responsible for the ticket maintains, including conversations with the person that raised the issue. A user may often want to find issues or tickets, based on the past -conversations that were recorded, as much as he/she needs to search +conversations that were recorded, as much as he or she needs to search in their mail for past conversations. This module will add dynamically a field 'message_content' to the search view of @@ -30,9 +30,8 @@ Installation ============ This module depends on the module 'base_search_fuzzy' to ensure that -searches on emails are based on indexes. Please read carefully the install -instructions: -https://github.com/OCA/server-tools/blob/9.0/base_search_fuzzy/README.rst +searches on emails are based on indexes. Please read carefully the +`install instructions `_. This module installs by default the indexes that are required to perform the searches on mail messages. @@ -40,12 +39,12 @@ perform the searches on mail messages. Usage ===== -Go to any model that contains a chatter (e.g. Partners, Leads, ...). Search +Go to any model that contains a chatter (e.g. Contacts, ...). Search for content in field 'Message Content'. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/server-tools/9.0 + :target: https://runbot.odoo-community.org/runbot/server-tools/10.0 Bug Tracker =========== @@ -71,7 +70,6 @@ Contributors * Lois Rilo Antelo * Aaron Henriquez - Maintainer ---------- diff --git a/base_search_mail_content/__openerp__.py b/base_search_mail_content/__manifest__.py similarity index 81% rename from base_search_mail_content/__openerp__.py rename to base_search_mail_content/__manifest__.py index db6d9b2d..45a7ed0a 100644 --- a/base_search_mail_content/__openerp__.py +++ b/base_search_mail_content/__manifest__.py @@ -6,16 +6,15 @@ { "name": "Base Search Mail Content", - "version": "9.0.1.0.0", + "version": "10.0.1.0.0", "author": "Eficent," "SerpentCS," "Odoo Community Association (OCA)", - "website": "http://www.eficent.com", + "website": "https://github.com/OCA/social", "category": "Social", "data": ["data/trgm_index_data.xml", "views/trgm_index_view.xml"], - "depends": ["mail", - "base_search_fuzzy"], + "depends": ["mail", "base_search_fuzzy"], "license": "AGPL-3", 'installable': True, } diff --git a/base_search_mail_content/data/trgm_index_data.xml b/base_search_mail_content/data/trgm_index_data.xml index 0a84c926..78a25d85 100644 --- a/base_search_mail_content/data/trgm_index_data.xml +++ b/base_search_mail_content/data/trgm_index_data.xml @@ -1,6 +1,5 @@ - - + gin @@ -32,5 +31,4 @@ search="[('model','=','mail.message'),('name','=','reply_to')]"/> - - + diff --git a/base_search_mail_content/models/__init__.py b/base_search_mail_content/models/__init__.py index 780d0d14..b0b43827 100644 --- a/base_search_mail_content/models/__init__.py +++ b/base_search_mail_content/models/__init__.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- -# © 2016 Eficent Business and IT Consulting Services S.L. +# © 2016-17 Eficent Business and IT Consulting Services S.L. # (http://www.eficent.com) # © 2016 Serpent Consulting Services Pvt. Ltd. () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from . import mail_thread -from . import res_partner diff --git a/base_search_mail_content/models/mail_thread.py b/base_search_mail_content/models/mail_thread.py index b8a0f116..822f3d44 100644 --- a/base_search_mail_content/models/mail_thread.py +++ b/base_search_mail_content/models/mail_thread.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- -# © 2016 Eficent Business and IT Consulting Services S.L. +# © 2016-17 Eficent Business and IT Consulting Services S.L. # (http://www.eficent.com) # © 2016 Serpent Consulting Services Pvt. Ltd. () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from openerp import api, fields, models +from odoo import api, fields, models from lxml import etree -from openerp.osv import expression -from openerp.osv.orm import setup_modifiers +from odoo.osv import expression +from odoo.osv.orm import setup_modifiers class MailThread(models.AbstractModel): @@ -16,64 +16,52 @@ class MailThread(models.AbstractModel): def _search_message_content(self, operator, value): - main_operator = 'in' - if operator in expression.NEGATIVE_TERM_OPERATORS: - main_operator = 'not in' - operators = {'!=': '=', 'not like': 'like', - 'not ilike': 'ilike', 'not in': 'in'} - operator = operators[operator] - domain = [('model', '=', self._name), '|', '|', '|', '|', - ('record_name', operator, value), - ('subject', operator, value), ('body', operator, value), - ('email_from', operator, value), - ('reply_to', operator, value)] - recs = self.env['mail.message'].search(domain) - return [('id', main_operator, recs.mapped('res_id'))] - - @api.multi - def _compute_message_content(self): - """ We don't really need to show any content. This field is to be - used only by searches""" - return '' + model_domain = [('model', '=', self._name)] + if operator not in expression.NEGATIVE_TERM_OPERATORS: + model_domain += ["|"] * 4 + model_domain += [ + ('record_name', operator, value), + ('subject', operator, value), + ('body', operator, value), + ('email_from', operator, value), + ('reply_to', operator, value) + ] + recs = self.env['mail.message'].search(model_domain) + return [('id', 'in', recs.mapped('res_id'))] message_content = fields.Text( string='Message Content', help='Message content, to be used only in searches', - compute="_compute_message_content", + compute=lambda self: False, search='_search_message_content') - -_base_fields_view_get = models.BaseModel.fields_view_get - - -@api.model -def _custom_fields_view_get(self, view_id=None, view_type='form', - toolbar=False, submenu=False): - """ - Override to add message_ids field in all the objects - that inherits mail.thread - """ - # Tricky super call - res = _base_fields_view_get(self, view_id=view_id, view_type=view_type, - toolbar=toolbar, submenu=submenu) - if view_type == 'search' and self._fields.get('message_content'): - doc = etree.XML(res['arch']) - res['fields'].update({ - 'message_content': { - 'type': 'char', - 'string': 'Message content', - } - }) - - for node in doc.xpath("//field[1]"): - # Add message_content in search view - elem = etree.Element('field', { - 'name': 'message_content', + @api.model + def fields_view_get(self, view_id=None, view_type='form', toolbar=False, + submenu=False): + """ + Override to add message_content field in all the objects + that inherits mail.thread + """ + res = super(MailThread, self).fields_view_get( + view_id=view_id, view_type=view_type, toolbar=toolbar, + submenu=submenu) + if view_type == 'search' and self._fields.get('message_content'): + doc = etree.XML(res['arch']) + res['fields'].update({ + 'message_content': { + 'type': 'char', + 'string': 'Message Content', + } }) - setup_modifiers(elem) - node.addnext(elem) - res['arch'] = etree.tostring(doc) - return res - -models.BaseModel.fields_view_get = _custom_fields_view_get + for node in doc.xpath("//field[1]"): + # Add message_content in search view + elem = etree.Element( + 'field', + { + 'name': 'message_content', + }) + setup_modifiers(elem) + node.addnext(elem) + res['arch'] = etree.tostring(doc) + return res diff --git a/base_search_mail_content/models/res_partner.py b/base_search_mail_content/models/res_partner.py deleted file mode 100644 index 6aa6da6c..00000000 --- a/base_search_mail_content/models/res_partner.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Eficent Business and IT Consulting Services S.L. -# (http://www.eficent.com) -# © 2016 Serpent Consulting Services Pvt. Ltd. () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from openerp import models - - -class Partner(models.Model): - - _name = 'res.partner' - _inherit = ['res.partner', 'mail.thread'] diff --git a/base_search_mail_content/static/description/icon.png b/base_search_mail_content/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/base_search_mail_content/static/description/icon.png differ diff --git a/base_search_mail_content/tests/__init__.py b/base_search_mail_content/tests/__init__.py new file mode 100644 index 00000000..915ca325 --- /dev/null +++ b/base_search_mail_content/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_base_search_mail_content diff --git a/base_search_mail_content/tests/test_base_search_mail_content.py b/base_search_mail_content/tests/test_base_search_mail_content.py new file mode 100644 index 00000000..38b2c3eb --- /dev/null +++ b/base_search_mail_content/tests/test_base_search_mail_content.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo.tests.common import TransactionCase + + +class TestBaseSearchMailContent(TransactionCase): + def setUp(self): + super(TestBaseSearchMailContent, self).setUp() + self.channel_obj = self.env["mail.channel"] + + def test_base_search_mail_content_1(self): + res = self.channel_obj.search( + [('message_content', 'ilike', 'xxxyyyzzz')]) + self.assertFalse(res, "You have a channel with xxxyyyzzz :O") + + def test_base_search_mail_content_2(self): + res = self.channel_obj.load_views( + [[False, 'search']], {'load_fields': False, + 'load_filters': True, + 'toolbar': True}) + self.assertIn( + 'message_content', res['fields_views']['search']['fields'], + "message_content field was not detected") diff --git a/base_search_mail_content/views/trgm_index_view.xml b/base_search_mail_content/views/trgm_index_view.xml index 304a8365..ed3a55a8 100644 --- a/base_search_mail_content/views/trgm_index_view.xml +++ b/base_search_mail_content/views/trgm_index_view.xml @@ -1,29 +1,27 @@ - - + - - trgm.index.view.form - trgm.index - - - - [('ttype', 'in', ['char', 'text', 'html'])] - "You can either select a field of type 'text', 'char' or 'html'." - + + trgm.index.view.form + trgm.index + + + + [('ttype', 'in', ['char', 'text', 'html'])] + "You can either select a field of type 'text', 'char' or 'html'." - + + - - trgm.index.view.tree - trgm.index - - - - "You can either select a field of type 'text', 'char' or 'html'." - + + trgm.index.view.tree + trgm.index + + + + "You can either select a field of type 'text', 'char' or 'html'." - + + - - +