[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",
|
||||
"summary": "Friendlier search when typing in relation fields",
|
||||
"version": "13.0.1.0.0",
|
||||
"version": "14.0.1.0.0",
|
||||
"category": "Uncategorized",
|
||||
"website": "https://odoo-community.org/",
|
||||
"website": "https://github.com/OCA/server-tools",
|
||||
"author": "Daniel Reis, Odoo Community Association (OCA), ADHOC SA",
|
||||
"license": "AGPL-3",
|
||||
"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
|
||||
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):
|
||||
|
@ -174,7 +175,9 @@ class Base(models.AbstractModel):
|
|||
class IrModel(models.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_domain = fields.Char()
|
||||
|
||||
|
@ -208,7 +211,7 @@ class IrModel(models.Model):
|
|||
return super(IrModel, self)._register_hook()
|
||||
|
||||
def toggle_smart_search(self):
|
||||
""" Inverse the value of the field ``add_smart_search`` on the records
|
||||
in ``self``. """
|
||||
"""Inverse the value of the field ``add_smart_search`` on the records
|
||||
in ``self``."""
|
||||
for record in self:
|
||||
record.add_smart_search = not record.add_smart_search
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
* Daniel Reis <https://github.com/dreispt>
|
||||
* Kitti U. <kittiu@ecosoft.co.th> (migrate to v14)
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
# © 2016 Daniel Reis
|
||||
# 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)
|
||||
@post_install(True)
|
||||
@tagged("post_install", "-at_install")
|
||||
class NameSearchCase(TransactionCase):
|
||||
def setUp(self):
|
||||
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.name_search_ids = phone_field
|
||||
model_partner.add_smart_search = True
|
||||
|
@ -19,16 +18,16 @@ class NameSearchCase(TransactionCase):
|
|||
model_partner.name_search_domain = "[('parent_id', '=', False)]"
|
||||
self.Partner = self.env["res.partner"]
|
||||
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(
|
||||
{"name": "Ken Shabby", "customer": True, "phone": "+351 555 333 777"}
|
||||
{"name": "Ken Shabby", "phone": "+351 555 333 777"}
|
||||
)
|
||||
self.partner3 = self.Partner.create(
|
||||
{
|
||||
"name": "Johann Gambolputty of Ulm",
|
||||
"supplier": True,
|
||||
"phone": "+351 777 333 555",
|
||||
"barcode": "1111",
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -64,7 +63,7 @@ class NameSearchCase(TransactionCase):
|
|||
|
||||
def test_MustHonorDomain(self):
|
||||
"""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
|
||||
self.assertEqual(len(res), 1)
|
||||
self.assertEqual(res[0][0], gambulputty)
|
||||
|
|
Loading…
Reference in New Issue