base_search_fuzzy: Migration to 13.0

pull/2530/head
Ernesto Tejeda 2020-03-25 17:24:35 -04:00 committed by Daniel Reis
parent 37fb022bee
commit 1b9706d8fd
11 changed files with 107 additions and 50 deletions

View File

@ -14,13 +14,13 @@ Fuzzy Search
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/12.0/base_search_fuzzy
:target: https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_search_fuzzy
:target: https://translation.odoo-community.org/projects/server-tools-13-0/server-tools-13-0-base_search_fuzzy
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/149/12.0
:target: https://runbot.odoo-community.org/runbot/149/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@ -81,6 +81,19 @@ Usage
For further questions read the Documentation of the
`pg_trgm <https://www.postgresql.org/docs/current/static/pgtrgm.html>`_ module.
Usage with demo data
====================
There are some demo data that allow you to test functionally this module
if you are in a **demo** database. The steps are the following:
#. Then type the text **Jon Smith** or **Smith John** in the search box and
select **Search Display Name for: ...**
#. You will see two contacts, and they are the ones with display names
**John Smith** and **John Smizz**. (See corresponding `demo code
<https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy/demo/res_partner_demo.xml#L18>`_)
Known issues / Roadmap
======================
@ -93,7 +106,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/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 <https://github.com/OCA/server-tools/issues/new?body=module:%20base_search_fuzzy%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/server-tools/issues/new?body=module:%20base_search_fuzzy%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
@ -133,6 +146,6 @@ 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.
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/12.0/base_search_fuzzy>`_ project on GitHub.
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -5,7 +5,7 @@
"name": "Fuzzy Search",
"summary": "Fuzzy search with the PostgreSQL trigram extension",
"category": "Uncategorized",
"version": "12.0.1.0.0",
"version": "13.0.1.0.0",
"website": "https://github.com/OCA/server-tools",
"author": "bloopark systems GmbH & Co. KG, "
"Eficent, "
@ -13,6 +13,7 @@
"Odoo Community Association (OCA)",
"license": "AGPL-3",
"depends": ["base"],
"data": ["views/trgm_index.xml", "security/ir.model.access.csv",],
"data": ["views/trgm_index.xml", "security/ir.model.access.csv"],
"demo": ["demo/res_partner_demo.xml", "demo/TrgmIndex_demo.xml"],
"installable": True,
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="trgm_index_gin_partner_name" model="trgm.index">
<field name="field_id" ref="base.field_res_partner__name" />
<field name="index_type">gin</field>
</record>
</odoo>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_partner_John_Smith" model="res.partner">
<field name="name">John Smith</field>
</record>
<record id="res_partner_John_Smizz" model="res.partner">
<field name="name">John Smizz</field>
</record>
<record id="res_partner_Linus_Torvalds" model="res.partner">
<field name="name">Linus Torvalds</field>
</record>
<record id="view_res_partner_filter" model="ir.ui.view">
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="display_name" operator="%" />
</field>
</field>
</record>
</odoo>

View File

@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"

View File

@ -25,15 +25,15 @@ def patch_leaf_trgm(method):
if left in model._fields:
column = "{}.{}".format(table_alias, expression._quote(left))
query = "({} {} {})".format(
column,
sql_operator,
model._fields[left].column_format,
column, sql_operator, model._fields[left].column_format,
)
elif left in models.MAGIC_COLUMNS:
query = '({}."{}" {} %s)'.format(table_alias, left, sql_operator)
params = right
else: # Must not happen
raise ValueError(_("Invalid field {!r} in domain term {!r}".format(left, leaf)))
raise ValueError(
_("Invalid field {!r} in domain term {!r}".format(left, leaf))
)
if left in model._fields:
params = str(right)
@ -67,7 +67,6 @@ class IrModel(models.Model):
_inherit = "ir.model"
@api.model_cr
def _register_hook(self):
# We have to prevent wrapping the function twice to avoid recursion
# errors
@ -83,4 +82,4 @@ class IrModel(models.Model):
models.BaseModel._generate_order_by = patch_generate_order_by(
models.BaseModel._generate_order_by
)
return super(IrModel, self)._register_hook()
return super()._register_hook()

View File

@ -47,7 +47,6 @@ class TrgmIndex(models.Model):
'GiST for often-updated data."',
)
@api.model_cr
def _trgm_extension_exists(self):
self.env.cr.execute(
"""
@ -67,18 +66,16 @@ class TrgmIndex(models.Model):
return "installed"
@api.model_cr
def _is_postgres_superuser(self):
self.env.cr.execute("SHOW is_superuser;")
superuser = self.env.cr.fetchone()
return superuser is not None and superuser[0] == "on" or False
@api.model_cr
def _install_trgm_extension(self):
extension = self._trgm_extension_exists()
if extension == "missing":
_logger.warning(
"To use pg_trgm you have to install the " "postgres-contrib module."
"To use pg_trgm you have to install the postgres-contrib module."
)
elif extension == "uninstalled":
if self._is_postgres_superuser():
@ -94,9 +91,8 @@ class TrgmIndex(models.Model):
return True
return False
@api.model_cr_context
def _auto_init(self):
res = super(TrgmIndex, self)._auto_init()
res = super()._auto_init()
if self._install_trgm_extension():
_logger.info(
"The pg_trgm is loaded in the database and the "
@ -104,7 +100,6 @@ class TrgmIndex(models.Model):
)
return res
@api.model_cr
def get_not_used_index(self, index_name, table_name, inc=1):
if inc > 1:
new_index_name = index_name + str(inc)
@ -127,13 +122,12 @@ class TrgmIndex(models.Model):
return False, new_index_name
@api.multi
def create_index(self):
self.ensure_one()
if not self._install_trgm_extension():
raise exceptions.UserError(
_("The pg_trgm extension does not exists or cannot be " "installed.")
_("The pg_trgm extension does not exists or cannot be installed.")
)
table_name = self.env[self.field_id.model_id.model]._table
@ -172,17 +166,16 @@ class TrgmIndex(models.Model):
@api.model
def create(self, vals):
rec = super(TrgmIndex, self).create(vals)
rec = super().create(vals)
rec.index_name = rec.create_index()
return rec
@api.multi
def unlink(self):
for rec in self:
self.env.cr.execute(
"""
DROP INDEX IF EXISTS %(index)s;
""",
{"index": AsIs(rec.index_name),},
{"index": AsIs(rec.index_name)},
)
return super(TrgmIndex, self).unlink()
return super().unlink()

View File

@ -22,3 +22,15 @@
For further questions read the Documentation of the
`pg_trgm <https://www.postgresql.org/docs/current/static/pgtrgm.html>`_ module.
Usage with demo data
====================
There are some demo data that allow you to test functionally this module
if you are in a **demo** database. The steps are the following:
#. Go to *Contacts* and type the text **Jon Smith** or **Smith John** in
the search box and select **Search Display Name for: ...**
#. You will see two contacts, and they are the ones with display names
**John Smith** and **John Smizz**.

View File

@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/base_search_fuzzy"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_search_fuzzy"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/149/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-tools-13-0/server-tools-13-0-base_search_fuzzy"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/149/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This addon provides the ability to create GIN or GiST indexes of char and text
fields and also to use the search operator <cite>%</cite> in search domains. Currently
this module doesnt change the backend search or anything else. It provides
@ -378,12 +378,13 @@ only the possibility to perform the fuzzy search for external addons.</p>
<li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
<li><a class="reference internal" href="#configuration" id="id2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id4">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id5">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id6">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id7">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id8">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id9">Maintainers</a></li>
<li><a class="reference internal" href="#usage-with-demo-data" id="id4">Usage with demo data</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id5">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id6">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id7">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id8">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id9">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id10">Maintainers</a></li>
</ul>
</li>
</ul>
@ -434,25 +435,36 @@ followed:</p>
<p>For further questions read the Documentation of the
<a class="reference external" href="https://www.postgresql.org/docs/current/static/pgtrgm.html">pg_trgm</a> module.</p>
</div>
<div class="section" id="usage-with-demo-data">
<h1><a class="toc-backref" href="#id4">Usage with demo data</a></h1>
<p>There are some demo data that allow you to test functionally this module
if you are in a <strong>demo</strong> database. The steps are the following:</p>
<ol class="arabic simple">
<li>Then type the text <strong>Jon Smith</strong> or <strong>Smith John</strong> in the search box and
select <strong>Search Display Name for: …</strong></li>
<li>You will see two contacts, and they are the ones with display names
<strong>John Smith</strong> and <strong>John Smizz</strong>. (See corresponding <a class="reference external" href="https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy/demo/res_partner_demo.xml#L18">demo code</a>)</li>
</ol>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id4">Known issues / Roadmap</a></h1>
<h1><a class="toc-backref" href="#id5">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Modify the general search parts (e.g. in tree view or many2one fields)</li>
<li>Add better <cite>order by</cite> handling</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id5">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id6">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20base_search_fuzzy%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20base_search_fuzzy%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id6">Credits</a></h1>
<h1><a class="toc-backref" href="#id7">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id7">Authors</a></h2>
<h2><a class="toc-backref" href="#id8">Authors</a></h2>
<ul class="simple">
<li>bloopark systems GmbH &amp; Co. KG</li>
<li>Eficent</li>
@ -460,7 +472,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id8">Contributors</a></h2>
<h2><a class="toc-backref" href="#id9">Contributors</a></h2>
<ul class="simple">
<li>Christoph Giesel &lt;<a class="reference external" href="https://github.com/christophlsa">https://github.com/christophlsa</a>&gt;</li>
<li>Jordi Ballester &lt;<a class="reference external" href="mailto:jordi.ballester&#64;eficent.com">jordi.ballester&#64;eficent.com</a>&gt;</li>
@ -474,13 +486,13 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id9">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id10">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/base_search_fuzzy">OCA/server-tools</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/13.0/base_search_fuzzy">OCA/server-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>

View File

@ -2,11 +2,10 @@
# Copyright 2016 Serpent Consulting Services Pvt. Ltd.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.osv import expression
from odoo.tests.common import TransactionCase, at_install, post_install
from odoo.tests.common import TransactionCase, tagged
@at_install(False)
@post_install(True)
@tagged("post_install", "-at_install")
class QueryGenerationCase(TransactionCase):
def setUp(self):
super(QueryGenerationCase, self).setUp()
@ -30,7 +29,8 @@ class QueryGenerationCase(TransactionCase):
# test the right sql query statement creation
# now there should be only one '%'
complete_where = self.env.cr.mogrify(
"SELECT FROM {} WHERE {}".format(from_clause, where_clause), where_clause_params
"SELECT FROM {} WHERE {}".format(from_clause, where_clause),
where_clause_params,
)
self.assertEqual(
complete_where,
@ -53,7 +53,8 @@ class QueryGenerationCase(TransactionCase):
)
complete_where = self.env.cr.mogrify(
"SELECT FROM {} WHERE {}".format(from_clause, where_clause), where_clause_params
"SELECT FROM {} WHERE {}".format(from_clause, where_clause),
where_clause_params,
)
self.assertIn(
@ -76,7 +77,7 @@ class QueryGenerationCase(TransactionCase):
if not self.TrgmIndex.index_exists("res.partner", "name"):
field_partner_name = self.env.ref("base.field_res_partner__name")
self.TrgmIndex.create(
{"field_id": field_partner_name.id, "index_type": "gin",}
{"field_id": field_partner_name.id, "index_type": "gin"}
)
partner1 = self.ResPartner.create({"name": "John Smith"})

View File

@ -32,9 +32,7 @@
<record model="ir.actions.act_window" id="trgm_index_action">
<field name="name">Trigram Index</field>
<field name="res_model">trgm.index</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="type">ir.actions.act_window</field>
</record>
<menuitem
id="trgm_index_menu"