Browse Source

[MIG] base_search_mail_content: Migration to 10.0

pull/180/head
mreficent 7 years ago
parent
commit
b36457e894
  1. 3
      .gitignore
  2. 12
      base_search_mail_content/README.rst
  3. 7
      base_search_mail_content/__manifest__.py
  4. 6
      base_search_mail_content/data/trgm_index_data.xml
  5. 3
      base_search_mail_content/models/__init__.py
  6. 102
      base_search_mail_content/models/mail_thread.py
  7. 13
      base_search_mail_content/models/res_partner.py
  8. BIN
      base_search_mail_content/static/description/icon.png
  9. 3
      base_search_mail_content/tests/__init__.py
  10. 25
      base_search_mail_content/tests/test_base_search_mail_content.py
  11. 44
      base_search_mail_content/views/trgm_index_view.xml
  12. 1
      oca_dependencies.txt

3
.gitignore

@ -46,6 +46,9 @@ coverage.xml
# Translations
*.mo
# Pycharm
.idea
# Django stuff:
*.log

12
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 <https://github.com/OCA/server-tools/blob/10.0/base_search_fuzzy/README.rst>`_.
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 <lois.rilo@eficent.com>
* Aaron Henriquez <ahenriquez@eficent.com>
Maintainer
----------

7
base_search_mail_content/__openerp__.py → 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,
}

6
base_search_mail_content/data/trgm_index_data.xml

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<odoo noupdate="1">
<record id="subject_gin_idx" model="trgm.index">
<field name="index_type">gin</field>
@ -32,5 +31,4 @@
search="[('model','=','mail.message'),('name','=','reply_to')]"/>
</record>
</data>
</openerp>
</odoo>

3
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. (<http://www.serpentcs.com>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import mail_thread
from . import res_partner

102
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. (<http://www.serpentcs.com>)
# 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

13
base_search_mail_content/models/res_partner.py

@ -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. (<http://www.serpentcs.com>)
# 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']

BIN
base_search_mail_content/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

3
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

25
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")

44
base_search_mail_content/views/trgm_index_view.xml

@ -1,29 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<odoo>
<record model="ir.ui.view" id="trgm_index_view_form">
<field name="name">trgm.index.view.form</field>
<field name="model">trgm.index</field>
<field name="inherit_id" ref="base_search_fuzzy.trgm_index_view_form"/>
<field name="arch" type="xml">
<field name="field_id" position="attributes">
<attribute name="domain">[('ttype', 'in', ['char', 'text', 'html'])]</attribute>
<attribute name="help">"You can either select a field of type 'text', 'char' or 'html'."</attribute>
</field>
<record model="ir.ui.view" id="trgm_index_view_form">
<field name="name">trgm.index.view.form</field>
<field name="model">trgm.index</field>
<field name="inherit_id" ref="base_search_fuzzy.trgm_index_view_form"/>
<field name="arch" type="xml">
<field name="field_id" position="attributes">
<attribute name="domain">[('ttype', 'in', ['char', 'text', 'html'])]</attribute>
<attribute name="help">"You can either select a field of type 'text', 'char' or 'html'."</attribute>
</field>
</record>
</field>
</record>
<record model="ir.ui.view" id="trgm_index_view_tree">
<field name="name">trgm.index.view.tree</field>
<field name="model">trgm.index</field>
<field name="inherit_id" ref="base_search_fuzzy.trgm_index_view_tree"/>
<field name="arch" type="xml">
<field name="field_id" position="attributes">
<attribute name="help">"You can either select a field of type 'text', 'char' or 'html'."</attribute>
</field>
<record model="ir.ui.view" id="trgm_index_view_tree">
<field name="name">trgm.index.view.tree</field>
<field name="model">trgm.index</field>
<field name="inherit_id" ref="base_search_fuzzy.trgm_index_view_tree"/>
<field name="arch" type="xml">
<field name="field_id" position="attributes">
<attribute name="help">"You can either select a field of type 'text', 'char' or 'html'."</attribute>
</field>
</record>
</field>
</record>
</data>
</openerp>
</odoo>

1
oca_dependencies.txt

@ -0,0 +1 @@
server-tools
Loading…
Cancel
Save