You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							136 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							136 lines
						
					
					
						
							7.3 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Adarsh K (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| import psycopg2 | |
| from ast import literal_eval | |
| from odoo import http | |
| from odoo.http import request | |
| 
 | |
| 
 | |
| class MasterSearch(http.Controller): | |
|     """Controller for the master search functionality.""" | |
| 
 | |
|     @http.route("/master/search", methods=["POST"], type="json", | |
|                 auth="user") | |
|     def master_search(self, query): | |
|         """ | |
|         Perform a master search across all models in the system based on the | |
|         given query. | |
|  | |
|         This method performs a search across multiple models in the Odoo | |
|         system using the provided query string. The search is conducted on | |
|         all stored fields within the models associated with the installed | |
|         modules configured in the system. | |
|         """ | |
|         data = [] | |
|         # Check if the query is not empty | |
|         if query != '': | |
|             # Get all models in the system in the res.config.settings | |
|             config_settings = request.env['ir.config_parameter'].sudo().get_param( | |
|                 'master_search_systray.master_search_installed_ids') | |
|             if config_settings: | |
|                 config_settings_str = literal_eval(config_settings) | |
|                 # Convert to list of integers | |
|                 config_settings_ids = [int(id_str) for id_str in config_settings_str] | |
|                 # Fetch ir.module.module records for the selected module IDs | |
|                 config_modules = request.env['ir.module.module'].sudo().search([ | |
|                     ('id', 'in', config_settings_ids)]) | |
|                 # Collect module names from master_search_values | |
|                 module_names = [module.name for module in config_modules] | |
|                 # Fetch ir.module.module records for the selected module names | |
|                 modules = request.env['ir.module.module'].sudo().search([ | |
|                     ('name', 'in', module_names)]) | |
|                 for module in modules: | |
|                     models = request.env['ir.model'].sudo().search([]) | |
|                     filtered_models = models.filtered( | |
|                         lambda m: module.name in m.modules) | |
|                     # Loop through each model to perform the search | |
|                     for rec in filtered_models: | |
|                         # Filter out fields that are not stored in the database | |
|                         fields = rec.field_id.filtered(lambda f: f.store).mapped('name') | |
|                         # Check if the model's main name field is in the stored fields | |
|                         if rec._rec_name in fields: | |
|                             # Temporary list to store results for the current model | |
|                             temp_data = [] | |
|                             try: | |
|                                 # Execute a raw SQL query to search records in the current model | |
|                                 request.env.cr.execute( | |
|                                     "SELECT * FROM %s WHERE name ILIKE '%s'" % ( | |
|                                         rec.model.replace('.', '_'), '%' + query + '%')) | |
|                                 # request.env.cr.execute( | |
|                                 #     "SELECT * FROM %s WHERE name::text ILIKE '%s'" % ( | |
|                                 #         rec.model.replace('.', '_'), '%' + query + '%')) | |
|                                 # Fetch the results as a list of dictionaries | |
|                                 records = request.env.cr.dictfetchall() | |
|                                 # If there are matching records, process and append them to temp_data | |
|                                 if len(records) >= 1: | |
|                                     temp_data.append({ | |
|                                         'title': rec.name, | |
|                                         'name': None, | |
|                                         'id': None, | |
|                                         'isChild': False, | |
|                                         'isParent': True, | |
|                                         'model': rec.model | |
|                                     }) | |
|                                     for val in records: | |
|                                         temp_data.append({ | |
|                                             'title': None, | |
|                                             'name': val['name'], | |
|                                             'id': val['id'], | |
|                                             'isChild': True, | |
|                                             'isParent': False, | |
|                                             'model': rec.model | |
|                                         }) | |
|                                 # Append temp_data to the main result data | |
|                                 if records: | |
|                                     data.append(temp_data) | |
|                                 request.env.cr.commit() | |
|                             except psycopg2.Error: | |
|                                 request.env.cr.rollback() | |
|                                 try: | |
|                                     # If an exception occurs, attempt to perform a search using Odoo API | |
|                                     records = request.env[rec.model].search( | |
|                                         [('name', 'ilike', query)]) | |
|                                     temp_data = [] | |
|                                     # If there are matching records, process and append them to temp_data | |
|                                     if records: | |
|                                         temp_data.append({ | |
|                                             'title': rec.name, | |
|                                             'name': None, | |
|                                             'id': None, | |
|                                             'isChild': False, | |
|                                             'isParent': True, | |
|                                             'model': rec.model | |
|                                         }) | |
|                                         for val in records: | |
|                                             temp_data.append({ | |
|                                                 'title': None, | |
|                                                 'name': val['name'], | |
|                                                 'id': val['id'], | |
|                                                 'isChild': True, | |
|                                                 'isParent': False, | |
|                                                 'model': rec.model | |
|                                             }) | |
|                                         data.append(temp_data) | |
|                                     request.env.cr.commit() | |
|                                 except Exception as e: | |
|                                     request.env.cr.rollback() | |
|         return data
 | |
| 
 |