Parcourir la source

commit inicial

Rodney Enciso Arias il y a 8 ans
commit
5051c1e311
28 fichiers modifiés avec 691 ajouts et 0 suppressions
  1. 121 0
      README.rst
  2. 2 0
      __init__.py
  3. BIN
      __init__.pyc
  4. 19 0
      __openerp__.py
  5. 29 0
      i18n/de.po
  6. 30 0
      i18n/es.po
  7. 29 0
      i18n/es_ES.po
  8. 29 0
      i18n/eu.po
  9. 29 0
      i18n/fi.po
  10. 29 0
      i18n/fr.po
  11. 29 0
      i18n/hr.po
  12. 29 0
      i18n/hr_HR.po
  13. 29 0
      i18n/it.po
  14. 29 0
      i18n/pt_BR.po
  15. 30 0
      i18n/sl.po
  16. 30 0
      i18n/tr.po
  17. 29 0
      i18n/tr_TR.po
  18. BIN
      images/image0.png
  19. BIN
      images/image1.png
  20. BIN
      images/image2.png
  21. 2 0
      models/__init__.py
  22. BIN
      models/__init__.pyc
  23. 83 0
      models/ir_model.py
  24. BIN
      models/ir_model.pyc
  25. BIN
      static/description/icon.png
  26. 5 0
      tests/__init__.py
  27. 54 0
      tests/test_name_search.py
  28. 25 0
      views/ir_model.xml

+ 121 - 0
README.rst

@@ -0,0 +1,121 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+   :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+   :alt: License: AGPL-3
+
+====================
+Improved Name Search
+====================
+
+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.
+
+.. image:: 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.
+
+.. image:: 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.
+
+
+Installation
+============
+
+No specific requirements.
+
+
+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.
+
+.. image:: images/image1.png
+
+
+Usage
+=====
+
+Just type into any related field, such as Customer on a Sale Order.
+
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+   :alt: Try me on Runbot
+   :target: https://runbot.odoo-community.org/runbot/149/8.0
+
+.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt
+.. branch is "8.0" for example
+
+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.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
+
+Contributors
+------------
+
+* Daniel Reis <https://github.com/dreispt>
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+   :alt: Odoo Community Association
+   :target: https://odoo-community.org
+
+This module is maintained by the OCA.
+
+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.
+
+To contribute to this module, please visit https://odoo-community.org.

+ 2 - 0
__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import models

BIN
__init__.pyc


+ 19 - 0
__openerp__.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# © 2016 Daniel Reis
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+    'name': 'Improved Name Search',
+    'summary': 'Friendlier search when typing in relation fields',
+    'version': '8.0.1.0.1',
+    'category': 'Uncategorized',
+    'website': 'https://odoo-community.org/',
+    'author': 'Daniel Reis, Odoo Community Association (OCA)',
+    'license': 'AGPL-3',
+    'data': [
+        'views/ir_model.xml',
+    ],
+    'installable': True,
+    'depends': [
+        'base',
+    ],
+}

+ 29 - 0
i18n/de.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Rudolf Schnapka <rs@techno-flex.de>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-17 02:42+0000\n"
+"PO-Revision-Date: 2016-06-17 02:42+0000\n"
+"Last-Translator: Rudolf Schnapka <rs@techno-flex.de>, 2016\n"
+"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modelle"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 30 - 0
i18n/es.po

@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# OCA Transbot <transbot@odoo-community.org>, 2016
+# Pedro M. Baeza <pedro.baeza@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-24 04:14+0000\n"
+"PO-Revision-Date: 2016-12-24 04:14+0000\n"
+"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2016\n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modelos"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr "Campos de la búsqueda de nombres"

+ 29 - 0
i18n/es_ES.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Fernando Lara <gennesis45@gmail.com>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-02-11 06:39+0000\n"
+"PO-Revision-Date: 2017-02-11 06:39+0000\n"
+"Last-Translator: Fernando Lara <gennesis45@gmail.com>, 2017\n"
+"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/es_ES/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_ES\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modelos"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr "Campos de búsqueda de nombres"

+ 29 - 0
i18n/eu.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Esther Martín Menéndez <esthermartin001@gmail.com>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-02-21 21:56+0000\n"
+"PO-Revision-Date: 2017-02-21 21:56+0000\n"
+"Last-Translator: Esther Martín Menéndez <esthermartin001@gmail.com>, 2017\n"
+"Language-Team: Basque (https://www.transifex.com/oca/teams/23907/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Models"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/fi.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-21 00:47+0000\n"
+"PO-Revision-Date: 2016-09-21 00:47+0000\n"
+"Last-Translator: Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2016\n"
+"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Mallit"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/fr.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# OCA Transbot <transbot@odoo-community.org>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-17 02:42+0000\n"
+"PO-Revision-Date: 2016-06-17 02:42+0000\n"
+"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
+"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modèles"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/hr.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Bole <bole@dajmi5.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-21 00:47+0000\n"
+"PO-Revision-Date: 2016-09-21 00:47+0000\n"
+"Last-Translator: Bole <bole@dajmi5.com>, 2016\n"
+"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modeli"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/hr_HR.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Bole <bole@dajmi5.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-21 00:47+0000\n"
+"PO-Revision-Date: 2016-09-21 00:47+0000\n"
+"Last-Translator: Bole <bole@dajmi5.com>, 2016\n"
+"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/hr_HR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hr_HR\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modeli"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/it.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Paolo Valier <paolo.valier@hotmail.it>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-17 02:42+0000\n"
+"PO-Revision-Date: 2016-06-17 02:42+0000\n"
+"Last-Translator: Paolo Valier <paolo.valier@hotmail.it>, 2016\n"
+"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modelli"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 29 - 0
i18n/pt_BR.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Armando Vulcano Junior <vulcano@uol.com.br>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-17 02:42+0000\n"
+"PO-Revision-Date: 2016-06-17 02:42+0000\n"
+"Last-Translator: Armando Vulcano Junior <vulcano@uol.com.br>, 2016\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modelos"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

+ 30 - 0
i18n/sl.po

@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# OCA Transbot <transbot@odoo-community.org>, 2016
+# Matjaž Mozetič <m.mozetic@matmoz.si>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-17 02:42+0000\n"
+"PO-Revision-Date: 2016-06-17 02:42+0000\n"
+"Last-Translator: Matjaž Mozetič <m.mozetic@matmoz.si>, 2016\n"
+"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modeli"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr "Polja iskanja po imenu"

+ 30 - 0
i18n/tr.po

@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# OCA Transbot <transbot@odoo-community.org>, 2016
+# Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-24 05:31+0000\n"
+"PO-Revision-Date: 2016-12-24 05:31+0000\n"
+"Last-Translator: Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2016\n"
+"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Modeller"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr "İsim Arama Alanları"

+ 29 - 0
i18n/tr_TR.po

@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_name_search_improved
+# 
+# Translators:
+# Ozge Altinisik <ozge@altinkaya.com.tr>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-31 08:34+0000\n"
+"PO-Revision-Date: 2016-12-31 08:34+0000\n"
+"Last-Translator: Ozge Altinisik <ozge@altinkaya.com.tr>, 2017\n"
+"Language-Team: Turkish (Turkey) (https://www.transifex.com/oca/teams/23907/tr_TR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr_TR\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: base_name_search_improved
+#: model:ir.model,name:base_name_search_improved.model_ir_model
+msgid "Models"
+msgstr "Tipler"
+
+#. module: base_name_search_improved
+#: field:ir.model,name_search_ids:0
+msgid "Name Search Fields"
+msgstr ""

BIN
images/image0.png


BIN
images/image1.png


BIN
images/image2.png


+ 2 - 0
models/__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import ir_model

BIN
models/__init__.pyc


+ 83 - 0
models/ir_model.py

@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+# © 2016 Daniel Reis
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from openerp import models, fields, api
+from openerp import SUPERUSER_ID
+from openerp import tools
+
+
+# Extended name search is only used on some operators
+ALLOWED_OPS = set(['ilike', 'like'])
+
+
+@tools.ormcache(skiparg=0)
+def _get_rec_names(self):
+    "List of fields to search into"
+    model = self.env['ir.model'].search(
+        [('model', '=', str(self._model))])
+    rec_name = [self._rec_name] or []
+    other_names = model.name_search_ids.mapped('name')
+    return rec_name + other_names
+
+
+def _extend_name_results(self, domain, results, limit):
+    result_count = len(results)
+    if result_count < limit:
+        domain += [('id', 'not in', [x[0] for x in results])]
+        recs = self.search(domain, limit=limit - result_count)
+        results.extend(recs.name_get())
+    return results
+
+
+class ModelExtended(models.Model):
+    _inherit = 'ir.model'
+
+    name_search_ids = fields.Many2many(
+        'ir.model.fields',
+        string='Name Search Fields')
+
+    def _register_hook(self, cr, ids=None):
+
+        def make_name_search():
+
+            @api.model
+            def name_search(self, name='', args=None,
+                            operator='ilike', limit=100):
+                # Perform standard name search
+                res = name_search.origin(
+                    self, name=name, args=args, operator=operator, limit=limit)
+                enabled = self.env.context.get('name_search_extended', True)
+                # Perform extended name search
+                # Note: Empty name causes error on
+                #       Customer->More->Portal Access Management
+                if name and enabled and operator in ALLOWED_OPS:
+                    # Support a list of fields to search on
+                    all_names = _get_rec_names(self)
+                    base_domain = args or []
+                    # Try regular search on each additional search field
+                    for rec_name in all_names[1:]:
+                        domain = [(rec_name, operator, name)]
+                        res = _extend_name_results(
+                            self, base_domain + domain, res, limit)
+                    # Try ordered word search on each of the search fields
+                    for rec_name in all_names:
+                        domain = [(rec_name, operator, name.replace(' ', '%'))]
+                        res = _extend_name_results(
+                            self, base_domain + domain, res, limit)
+                    # Try unordered word search on each of the search fields
+                    for rec_name in all_names:
+                        domain = [(rec_name, operator, x)
+                                  for x in name.split() if x]
+                        res = _extend_name_results(
+                            self, base_domain + domain, res, limit)
+                return res
+            return name_search
+
+        if ids is None:
+            ids = self.search(cr, SUPERUSER_ID, [])
+        for model in self.browse(cr, SUPERUSER_ID, ids):
+            Model = self.pool.get(model.model)
+            if Model:
+                Model._patch_method('name_search', make_name_search())
+        return super(ModelExtended, self)._register_hook(cr)

BIN
models/ir_model.pyc


BIN
static/description/icon.png


+ 5 - 0
tests/__init__.py

@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# © 2016 Daniel Reis
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_name_search

+ 54 - 0
tests/test_name_search.py

@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# © 2016 Daniel Reis
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from openerp.tests.common import TransactionCase, at_install, post_install
+
+
+@at_install(False)
+@post_install(True)
+class NameSearchCase(TransactionCase):
+
+    def setUp(self):
+        super(NameSearchCase, self).setUp()
+        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
+        self.Partner = self.env['res.partner']
+        self.partner1 = self.Partner.create(
+            {'name': 'Luigi Verconti',
+             'customer': True,
+             'phone': '+351 555 777 333'})
+        self.partner2 = self.Partner.create(
+            {'name': 'Ken Shabby',
+             'customer': True,
+             'phone': '+351 555 333 777'})
+        self.partner3 = self.Partner.create(
+            {'name': 'Johann Gambolputty of Ulm',
+             'supplier': True,
+             'phone': '+351 777 333 555'})
+
+    def test_RelevanceOrderedResults(self):
+        """Return results ordered by relevance"""
+        res = self.Partner.name_search('555 777')
+        self.assertEqual(
+            res[0][0], self.partner1.id,
+            'Match full string honoring spaces')
+        self.assertEqual(
+            res[1][0], self.partner2.id,
+            'Match words honoring order of appearance')
+        self.assertEqual(
+            res[2][0], self.partner3.id,
+            'Match all words, regardless of order of appearance')
+
+    def test_NameSearchMustMatchAllWords(self):
+        """Must Match All Words"""
+        res = self.Partner.name_search('ulm 555 777')
+        self.assertFalse(res)
+
+    def test_MustHonorDomain(self):
+        """Must also honor a provided Domain"""
+        res = self.Partner.name_search('+351', args=[('supplier', '=', True)])
+        gambulputty = self.partner3.id
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], gambulputty)

+ 25 - 0
views/ir_model.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- © 2016 Daniel Reis
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
+
+<openerp>
+<data>
+
+<record id="view_model_form" model="ir.ui.view">
+    <field name="name">Add Name Searchable to Models</field>
+    <field name="model">ir.model</field>
+    <field name="inherit_id" ref="base.view_model_form"/>
+    <field name="arch" type="xml">
+
+        <field name="state" position="after">
+            <field name="name_search_ids"
+                   widget="many2many_tags"
+                   domain="[('model_id', '=', id)]"
+                />
+        </field>
+
+    </field>
+</record>
+
+</data>
+</openerp>