Files
gzth/sh_backmate_theme_adv_enterprise/models/global_search.py
T
2026-05-25 11:07:32 +08:00

212 lines
12 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (C) Softhealer Technologies.
from odoo import fields,models,api,_
from odoo.exceptions import UserError
FIELD_TYPES = [(key, key) for key in sorted(fields.Field.by_type)]
class ResCompany(models.Model):
_inherit = 'res.company'
enable_menu_search = fields.Boolean("Enable Menu Global Search", default=True)
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
enable_menu_search = fields.Boolean(related="company_id.enable_menu_search", string="Enable Menu Global Search",readonly=False)
class GlobalSearch(models.Model):
_name = 'global.search'
_description = "Global Search"
_rec_name ='model_id'
model_id = fields.Many2one('ir.model', string='Applies To', required=True, index=True, ondelete='cascade',
help="The model this field belongs to")
field_ids = fields.Many2many('ir.model.fields', string='Fields',domain="[('model_id','=',model_id)]")
main_field_id = fields.Many2one('ir.model.fields',string="Name Field",required=True,domain="[('model_id','=',model_id)]", ondelete='cascade')
global_field_ids = fields.One2many('global.search.fields','global_search_id', string='Fields ')
@api.model
def get_search_result(self,query):
search_result ={}
if self.env.user.company_id.enable_menu_search:
menu_roots = self.env['ir.ui.menu'].search([('parent_id', '=', False)])
menu_data = self.env['ir.ui.menu'].search([('id', 'child_of', menu_roots.ids),('name','ilike',query[0].lower()),('action','!=',False)])
if menu_data:
menu_data = menu_data._filter_visible_menus()
for menu in menu_data:
search_result['menu| '+menu.complete_name] = {'id':menu.id,'action':menu.action.id,'name':menu.complete_name}
# All Global Search Records
single_company = self.env['res.company'].search_count([])
for company in self.env['res.company'].search([]):
for search_rec in self.env['global.search'].sudo().search([]):
# All Field List including name field
field_list = []
for field in search_rec.global_field_ids:
field_list.append(field.field_id.name)
if search_rec.main_field_id.name not in field_list:
field_list.append(search_rec.main_field_id.name)
# Fetch all record of this current model with defined field list
try:
if single_company ==1:
model_obj = self.env[search_rec.model_id.model].search_read(['|',('company_id','=',company.id),('company_id','=',False)],field_list,order='id')
else:
model_obj = self.env[search_rec.model_id.model].search_read([('company_id','=',company.id)],field_list,order='id')
for model_rec in model_obj:
for field_row in search_rec.global_field_ids:
field = field_row.field_id
if field.ttype in ['char','boolean','text','date','datetime','float','integer','selection','monetary']:
if model_rec.get(field.name):
object_data = model_rec.get(field.name)
if object_data and query[0].lower() in str(object_data).casefold():
model_rec['model']=field.model_id.model
model_rec['model_name']=field.model_id.name
search_result[company.name+'|'+field.field_description+' : '+str(object_data)] = model_rec
if field.ttype in [ 'many2one']:
if model_rec.get(field.name):
object_data = model_rec.get(field.name)
if object_data and query[0].lower() in str(object_data[1]).casefold():
model_rec['model']=field.model_id.model
model_rec['model_name']=field.model_id.name
search_result_model = str(field.model_id.name)
search_result_record = model_rec.get(search_rec.main_field_id.name) or ''
str_object_data = str(object_data[1])
search_result[company.name+'|'+search_result_record+' > '+field.field_description+' : '+str_object_data] = model_rec
if field.ttype in [ 'one2many']:
if model_rec.get(field.name):
data_list = model_rec.get(field.name)
related_o2m_model = field.relation
o2m_field_list = []
for o2m_field in field_row.field_ids:
o2m_field_list.append(o2m_field.field_id.name)
o2m_model_obj = self.env[related_o2m_model].search_read([('id','in',data_list),('company_id','=',company.id)],o2m_field_list,order='id')
# o2m for loop
if o2m_model_obj:
for o2m_model_rec in o2m_model_obj:
for o2m_field_row in field_row.field_ids:
o2m_field = o2m_field_row.field_id
if o2m_field.ttype in ['char','boolean','text','date','datetime','float','integer','selection','monetary']:
if o2m_model_rec.get(o2m_field.name):
o2m_object_data = o2m_model_rec.get(o2m_field.name)
if o2m_object_data and query[0].lower() in str(o2m_object_data).casefold():
# link with main object not o2m object
o2m_model_rec['model']=field.model_id.model
o2m_model_rec['model_name']=field.model_id.name
o2m_model_rec['id']=model_rec.get('id')
search_result_model = str(field.model_id.name)
search_result_record = model_rec.get(search_rec.main_field_id.name) or ''
str_object_data = str(o2m_object_data)
search_result[company.name+'|'+search_result_record+' > '+o2m_field.field_description+' : '+str_object_data] = o2m_model_rec
if o2m_field.ttype in [ 'many2one']:
if o2m_model_rec.get(o2m_field.name):
o2m_object_data = o2m_model_rec.get(o2m_field.name)
if o2m_object_data and query[0].lower() in str(o2m_object_data[1]).casefold():
# link with main object not o2m object
o2m_model_rec['model']=field.model_id.model
o2m_model_rec['model_name']=field.model_id.name
o2m_model_rec['id']=model_rec.get('id')
search_result_model = str(field.model_id.name)
search_result_record = model_rec.get(search_rec.main_field_id.name) or ''
str_object_data = str(o2m_object_data[1])
search_result[company.name+'|'+search_result_record+' > '+o2m_field.field_description+' : '+str_object_data] = o2m_model_rec
except Exception as e:
pass
return search_result
class GlobalSearchFields(models.Model):
_name = 'global.search.fields'
_description = 'Global Search Fields'
global_search_id = fields.Many2one('global.search', string='Related Model')
sequence = fields.Integer(string='Sequence', default=10)
field_id = fields.Many2one('ir.model.fields', string='Position Field', ondelete='cascade')
name = fields.Char("Label", related="field_id.field_description")
model_id = fields.Many2one('ir.model',string='Model')
related_model_id = fields.Char(string='Relation With ', related="field_id.relation")
ttype = fields.Selection(string='Field Type', required=True,related="field_id.ttype")
field_ids = fields.One2many('o2m.global.search.fields','global_o2m_search_id', string='Fields')
@api.onchange('field_id')
def _onchange_field_id(self):
if self.field_id:
if self.field_id.relation:
model = self.env['ir.model'].sudo().search([('model','=',self.field_id.relation)],limit=1)
if model:
self.model_id = model.id
def sh_o2m_dynamic_action_action(self):
if self.ttype == 'one2many':
view = self.env.ref('sh_backmate_theme_adv_enterprise.sh_o2m_global_search_form')
return {
'name': _('O2M Object Fields'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'global.search.fields',
'views': [(view.id, 'form')],
'view_id': view.id,
'target': 'new',
'res_id': self.id,
}
else:
view = self.env.ref('sh_backmate_theme_adv_enterprise.sh_m2o_global_search_form')
return {
'name': _('M2O Object Fields'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'global.search.fields',
'views': [(view.id, 'form')],
'view_id': view.id,
'target': 'new',
'res_id': self.id,
}
class O2MGlobalSearch(models.Model):
_name = 'o2m.global.search.fields'
_description = 'O2M Global Search Fields'
sequence = fields.Integer(string='Sequence', default=10)
name = fields.Char("Label")
field_id = fields.Many2one('ir.model.fields', string='Position Field', ondelete='cascade')
global_o2m_search_id = fields.Many2one('global.search.fields', string='Global O2M Search')
model_id = fields.Many2one('ir.model', string='Relation With', ondelete='cascade')
related_model_id = fields.Char(string='Relation With ', related="field_id.relation")
ttype = fields.Selection(string='Field Type', required=True,related="field_id.ttype")
@api.onchange('field_id')
def _onchange_field_id(self):
if self.field_id:
if self.field_id.ttype in ['one2many','many2many']:
raise UserError("Field type One2many and Many2many not supported inside O2M wizard !")
self.name = self.field_id.field_description
if self.field_id.relation:
model = self.env['ir.model'].sudo().search([('model','=',self.field_id.relation)],limit=1)
if model:
self.model_id = model.id