[14.0][MIG] base_name_search_improved
parent
a768a1de63
commit
e37419adda
|
@ -1,141 +0,0 @@
|
||||||
====================
|
|
||||||
Improved Name Search
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
!! This file is generated by oca-gen-addon-readme !!
|
|
||||||
!! changes will be overwritten. !!
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
|
||||||
:target: https://odoo-community.org/page/development-status
|
|
||||||
:alt: Beta
|
|
||||||
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
|
||||||
: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/11.0/base_name_search_improved
|
|
||||||
: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-11-0/server-tools-11-0-base_name_search_improved
|
|
||||||
: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/11.0
|
|
||||||
:alt: Try me on Runbot
|
|
||||||
|
|
||||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
|
||||||
|
|
||||||
Extends the name search feature to use additional, more relaxed
|
|
||||||
matching methods, and to allow searching into configurable additional
|
|
||||||
record fields.
|
|
||||||
|
|
||||||
The name search is the lookup feature to select a related record.
|
|
||||||
For example, selecting a Customer on a new Sales order.
|
|
||||||
|
|
||||||
For example, typing "john brown" doesn't match "John M. Brown".
|
|
||||||
The relaxed search also looks up for records containing all the words,
|
|
||||||
so "John M. Brown" would be a match.
|
|
||||||
It also tolerates words in a different order, so searching
|
|
||||||
for "brown john" also works.
|
|
||||||
|
|
||||||
.. figure:: https://raw.githubusercontent.com/OCA/server-tools/11.0/base_name_search_improved/images/image0.png
|
|
||||||
|
|
||||||
Additionally, an Administrator can configure other fields to also lookup into.
|
|
||||||
For example, Customers could be additionally searched by City or Phone number.
|
|
||||||
|
|
||||||
.. figure:: https://raw.githubusercontent.com/OCA/server-tools/11.0/base_name_search_improved/images/image2.png
|
|
||||||
|
|
||||||
How it works:
|
|
||||||
|
|
||||||
Regular name search is performed, and the additional search logic is only
|
|
||||||
triggered if not enough results are found.
|
|
||||||
This way, no overhead is added on searches that would normally yield results.
|
|
||||||
|
|
||||||
But if not enough results are found, then additional search methods are tried.
|
|
||||||
The specific methods used are:
|
|
||||||
|
|
||||||
- Try regular search on each of the additional fields
|
|
||||||
- Try ordered word search on each of the search fields
|
|
||||||
- Try unordered word search on each of the search fields
|
|
||||||
|
|
||||||
All results found are presented in that order,
|
|
||||||
hopefully presenting them in order of relevance.
|
|
||||||
|
|
||||||
**Table of contents**
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:local:
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
=============
|
|
||||||
|
|
||||||
The fuzzy search is automatically enabled on all Models.
|
|
||||||
Note that this only affects typing in related fields.
|
|
||||||
The regular ``search()``, used in the top right search box, is not affected.
|
|
||||||
|
|
||||||
Additional search fields can be configured at Settings > Technical > Database > Models,
|
|
||||||
using the "Name Search Fields" field.
|
|
||||||
|
|
||||||
.. figure:: https://raw.githubusercontent.com/OCA/server-tools/11.0/base_name_search_improved/images/image1.png
|
|
||||||
:alt: Name Search Fields
|
|
||||||
:width: 600 px
|
|
||||||
|
|
||||||
Usage
|
|
||||||
=====
|
|
||||||
|
|
||||||
Just type into any related field, such as Customer on a Sale Order.
|
|
||||||
|
|
||||||
Known issues / Roadmap
|
|
||||||
======================
|
|
||||||
|
|
||||||
* Also use fuzzy search, such as the Levenshtein distance:
|
|
||||||
https://www.postgresql.org/docs/9.5/static/fuzzystrmatch.html
|
|
||||||
* The list of additional fields to search could benefit from caching, for efficiency.
|
|
||||||
* This feature could also be implemented for regular ``search`` on the ``name`` field.
|
|
||||||
|
|
||||||
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_name_search_improved%0Aversion:%2011.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.
|
|
||||||
|
|
||||||
Credits
|
|
||||||
=======
|
|
||||||
|
|
||||||
Authors
|
|
||||||
~~~~~~~
|
|
||||||
|
|
||||||
* Daniel Reis
|
|
||||||
|
|
||||||
Contributors
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Daniel Reis <https://github.com/dreispt>
|
|
||||||
|
|
||||||
Other credits
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The development of this module has been financially supported by:
|
|
||||||
|
|
||||||
* Odoo Community Association
|
|
||||||
|
|
||||||
Maintainers
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
This module is maintained by the OCA.
|
|
||||||
|
|
||||||
.. image:: https://odoo-community.org/logo.png
|
|
||||||
:alt: Odoo Community Association
|
|
||||||
:target: https://odoo-community.org
|
|
||||||
|
|
||||||
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/11.0/base_name_search_improved>`_ project on GitHub.
|
|
||||||
|
|
||||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
|
|
@ -3,9 +3,9 @@
|
||||||
{
|
{
|
||||||
"name": "Improved Name Search",
|
"name": "Improved Name Search",
|
||||||
"summary": "Friendlier search when typing in relation fields",
|
"summary": "Friendlier search when typing in relation fields",
|
||||||
"version": "13.0.1.0.0",
|
"version": "14.0.1.0.0",
|
||||||
"category": "Uncategorized",
|
"category": "Uncategorized",
|
||||||
"website": "https://odoo-community.org/",
|
"website": "https://github.com/OCA/server-tools",
|
||||||
"author": "Daniel Reis, Odoo Community Association (OCA), ADHOC SA",
|
"author": "Daniel Reis, Odoo Community Association (OCA), ADHOC SA",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"data": ["views/ir_model_views.xml"],
|
"data": ["views/ir_model_views.xml"],
|
||||||
|
|
|
@ -137,7 +137,8 @@ class Base(models.AbstractModel):
|
||||||
|
|
||||||
# TODO perhaps better to create only the field when enabled on the model
|
# TODO perhaps better to create only the field when enabled on the model
|
||||||
smart_search = fields.Char(
|
smart_search = fields.Char(
|
||||||
compute="_compute_smart_search", search="_search_smart_search",
|
compute="_compute_smart_search",
|
||||||
|
search="_search_smart_search",
|
||||||
)
|
)
|
||||||
|
|
||||||
def _compute_smart_search(self):
|
def _compute_smart_search(self):
|
||||||
|
@ -174,7 +175,9 @@ class Base(models.AbstractModel):
|
||||||
class IrModel(models.Model):
|
class IrModel(models.Model):
|
||||||
_inherit = "ir.model"
|
_inherit = "ir.model"
|
||||||
|
|
||||||
add_smart_search = fields.Boolean(help="Add Smart Search on search views",)
|
add_smart_search = fields.Boolean(
|
||||||
|
help="Add Smart Search on search views",
|
||||||
|
)
|
||||||
name_search_ids = fields.Many2many("ir.model.fields", string="Name Search Fields")
|
name_search_ids = fields.Many2many("ir.model.fields", string="Name Search Fields")
|
||||||
name_search_domain = fields.Char()
|
name_search_domain = fields.Char()
|
||||||
|
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
* Daniel Reis <https://github.com/dreispt>
|
* Daniel Reis <https://github.com/dreispt>
|
||||||
|
* Kitti U. <kittiu@ecosoft.co.th> (migrate to v14)
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
# © 2016 Daniel Reis
|
# © 2016 Daniel Reis
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo.tests.common import TransactionCase, at_install, post_install
|
from odoo.tests.common import TransactionCase, tagged
|
||||||
|
|
||||||
|
|
||||||
@at_install(False)
|
@tagged("post_install", "-at_install")
|
||||||
@post_install(True)
|
|
||||||
class NameSearchCase(TransactionCase):
|
class NameSearchCase(TransactionCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(NameSearchCase, self).setUp()
|
super(NameSearchCase, self).setUp()
|
||||||
phone_field = self.env.ref("base.field_res_partner_phone")
|
phone_field = self.env.ref("base.field_res_partner__phone")
|
||||||
model_partner = self.env.ref("base.model_res_partner")
|
model_partner = self.env.ref("base.model_res_partner")
|
||||||
model_partner.name_search_ids = phone_field
|
model_partner.name_search_ids = phone_field
|
||||||
model_partner.add_smart_search = True
|
model_partner.add_smart_search = True
|
||||||
|
@ -19,16 +18,16 @@ class NameSearchCase(TransactionCase):
|
||||||
model_partner.name_search_domain = "[('parent_id', '=', False)]"
|
model_partner.name_search_domain = "[('parent_id', '=', False)]"
|
||||||
self.Partner = self.env["res.partner"]
|
self.Partner = self.env["res.partner"]
|
||||||
self.partner1 = self.Partner.create(
|
self.partner1 = self.Partner.create(
|
||||||
{"name": "Luigi Verconti", "customer": True, "phone": "+351 555 777 333"}
|
{"name": "Luigi Verconti", "phone": "+351 555 777 333"}
|
||||||
)
|
)
|
||||||
self.partner2 = self.Partner.create(
|
self.partner2 = self.Partner.create(
|
||||||
{"name": "Ken Shabby", "customer": True, "phone": "+351 555 333 777"}
|
{"name": "Ken Shabby", "phone": "+351 555 333 777"}
|
||||||
)
|
)
|
||||||
self.partner3 = self.Partner.create(
|
self.partner3 = self.Partner.create(
|
||||||
{
|
{
|
||||||
"name": "Johann Gambolputty of Ulm",
|
"name": "Johann Gambolputty of Ulm",
|
||||||
"supplier": True,
|
|
||||||
"phone": "+351 777 333 555",
|
"phone": "+351 777 333 555",
|
||||||
|
"barcode": "1111",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -64,7 +63,7 @@ class NameSearchCase(TransactionCase):
|
||||||
|
|
||||||
def test_MustHonorDomain(self):
|
def test_MustHonorDomain(self):
|
||||||
"""Must also honor a provided Domain"""
|
"""Must also honor a provided Domain"""
|
||||||
res = self.Partner.name_search("+351", args=[("supplier", "=", True)])
|
res = self.Partner.name_search("+351", args=[("barcode", "=", "1111")])
|
||||||
gambulputty = self.partner3.id
|
gambulputty = self.partner3.id
|
||||||
self.assertEqual(len(res), 1)
|
self.assertEqual(len(res), 1)
|
||||||
self.assertEqual(res[0][0], gambulputty)
|
self.assertEqual(res[0][0], gambulputty)
|
||||||
|
|
Loading…
Reference in New Issue