62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
# -*- 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
|
|
|
|
|
|
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):
|
|
# Regular name search
|
|
res = name_search.origin(
|
|
self, name=name, args=args, operator=operator, limit=limit)
|
|
|
|
allowed_ops = ['ilike', 'like', '=']
|
|
if not res and operator in allowed_ops and self._rec_name:
|
|
# Support a list of fields to search on
|
|
model = self.env['ir.model'].search(
|
|
[('model', '=', str(self._model))])
|
|
other_names = model.name_search_ids.mapped('name')
|
|
# Try regular search on each additional search field
|
|
for rec_name in other_names:
|
|
domain = [(rec_name, operator, name)]
|
|
recs = self.search(domain, limit=limit)
|
|
if recs:
|
|
return recs.name_get()
|
|
# Try ordered word search on each of the search fields
|
|
for rec_name in [self._rec_name] + other_names:
|
|
domain = [(rec_name, operator, name.replace(' ', '%'))]
|
|
recs = self.search(domain, limit=limit)
|
|
if recs:
|
|
return recs.name_get()
|
|
# Try unordered word search on each of the search fields
|
|
for rec_name in [self._rec_name] + other_names:
|
|
domain = [(rec_name, operator, x)
|
|
for x in name.split() if x]
|
|
recs = self.search(domain, limit=limit)
|
|
if recs:
|
|
return recs.name_get()
|
|
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)
|