| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | # lint: pylint | 
					
						
							|  |  |  | """MongoDB engine (Offline)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | from pymongo import MongoClient  # pylint: disable=import-error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | engine_type = 'offline' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # mongodb connection variables | 
					
						
							|  |  |  | host = '127.0.0.1' | 
					
						
							|  |  |  | port = 27017 | 
					
						
							|  |  |  | username = '' | 
					
						
							|  |  |  | password = '' | 
					
						
							|  |  |  | database = None | 
					
						
							|  |  |  | collection = None | 
					
						
							|  |  |  | key = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # engine specific variables | 
					
						
							|  |  |  | paging = True | 
					
						
							|  |  |  | results_per_page = 20 | 
					
						
							|  |  |  | exact_match_only = False | 
					
						
							|  |  |  | result_template = 'key-value.html' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _client = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | def init(_): | 
					
						
							|  |  |  |     connect() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | def connect(): | 
					
						
							|  |  |  |     global _client  # pylint: disable=global-statement | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |     kwargs = {'port': port} | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  |     if username: | 
					
						
							|  |  |  |         kwargs['username'] = username | 
					
						
							|  |  |  |     if password: | 
					
						
							|  |  |  |         kwargs['password'] = password | 
					
						
							|  |  |  |     _client = MongoClient(host, **kwargs)[database][collection] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | def search(query, params): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  |     if exact_match_only: | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         q = {'$eq': query} | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         _re = re.compile('.*{0}.*'.format(re.escape(query)), re.I | re.M) | 
					
						
							|  |  |  |         q = {'$regex': _re} | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |     query = _client.find({key: q}).skip((params['pageno'] - 1) * results_per_page).limit(results_per_page) | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |     results.append({'number_of_results': query.count()}) | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  |     for r in query: | 
					
						
							|  |  |  |         del r['_id'] | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         r = {str(k): str(v) for k, v in r.items()} | 
					
						
							| 
									
										
										
										
											2021-07-15 21:35:33 +02:00
										 |  |  |         r['template'] = result_template | 
					
						
							|  |  |  |         results.append(r) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return results |