33import logging
44from abc import ABC , abstractmethod
55from collections import defaultdict
6+ from functools import cache
67
78from django .conf import settings
89from django .contrib .auth .models import AnonymousUser
10+ from django .core .exceptions import ImproperlyConfigured
11+ from django .utils .module_loading import import_string
912
1013import requests
1114
1417logger = logging .getLogger (__name__ )
1518
1619
20+ @cache
21+ def get_document_indexer_class () -> "BaseDocumentIndexer" :
22+ """Return the indexer backend class based on the settings."""
23+ classpath = settings .SEARCH_INDEXER_CLASS
24+
25+ if not classpath :
26+ raise ImproperlyConfigured (
27+ "SEARCH_INDEXER_CLASS must be set in Django settings."
28+ )
29+
30+ try :
31+ return import_string (settings .SEARCH_INDEXER_CLASS )
32+ except ImportError as err :
33+ raise ImproperlyConfigured (
34+ f"SEARCH_INDEXER_CLASS setting is not valid : { err } "
35+ ) from err
36+
37+
1738def get_batch_accesses_by_users_and_teams (paths ):
1839 """
1940 Get accesses related to a list of document paths,
2041 grouped by users and teams, including all ancestor paths.
2142 """
22- # print("paths: ", paths)
2343 ancestor_map = utils .get_ancestor_to_descendants_map (
2444 paths , steplen = models .Document .steplen
2545 )
2646 ancestor_paths = list (ancestor_map .keys ())
27- # print("ancestor map: ", ancestor_map)
28- # print("ancestor paths: ", ancestor_paths)
2947
3048 access_qs = models .DocumentAccess .objects .filter (
3149 document__path__in = ancestor_paths
@@ -80,6 +98,24 @@ def __init__(self, batch_size=None):
8098 Defaults to settings.SEARCH_INDEXER_BATCH_SIZE.
8199 """
82100 self .batch_size = batch_size or settings .SEARCH_INDEXER_BATCH_SIZE
101+ self .indexer_url = settings .SEARCH_INDEXER_URL
102+ self .indexer_secret = settings .SEARCH_INDEXER_SECRET
103+ self .search_url = settings .SEARCH_INDEXER_QUERY_URL
104+
105+ if not self .indexer_url :
106+ raise ImproperlyConfigured (
107+ "SEARCH_INDEXER_URL must be set in Django settings."
108+ )
109+
110+ if not self .indexer_secret :
111+ raise ImproperlyConfigured (
112+ "SEARCH_INDEXER_SECRET must be set in Django settings."
113+ )
114+
115+ if not self .search_url :
116+ raise ImproperlyConfigured (
117+ "SEARCH_INDEXER_QUERY_URL must be set in Django settings."
118+ )
83119
84120 def index (self ):
85121 """
@@ -143,7 +179,7 @@ def search(self, text, user, token):
143179 @abstractmethod
144180 def search_query (self , data , token ) -> dict :
145181 """
146- Retreive documents from the Find app API.
182+ Retrieve documents from the Find app API.
147183
148184 Must be implemented by subclasses.
149185 """
@@ -204,16 +240,9 @@ def search_query(self, data, token) -> requests.Response:
204240 Returns:
205241 dict: A JSON-serializable dictionary.
206242 """
207- url = getattr (settings , "SEARCH_INDEXER_QUERY_URL" , None )
208-
209- if not url :
210- raise RuntimeError (
211- "SEARCH_INDEXER_QUERY_URL must be set in Django settings before search."
212- )
213-
214243 try :
215244 response = requests .post (
216- url ,
245+ self . search_url ,
217246 json = data ,
218247 headers = {"Authorization" : f"Bearer { token } " },
219248 timeout = 10 ,
@@ -222,7 +251,6 @@ def search_query(self, data, token) -> requests.Response:
222251 return response .json ()
223252 except requests .exceptions .HTTPError as e :
224253 logger .error ("HTTPError: %s" , e )
225- logger .error ("Response content: %s" , response .text ) # type: ignore
226254 raise
227255
228256 def format_response (self , data : dict ):
@@ -238,27 +266,15 @@ def push(self, data):
238266 Args:
239267 data (list): List of document dictionaries.
240268 """
241- url = getattr (settings , "SEARCH_INDEXER_URL" , None )
242- if not url :
243- raise RuntimeError (
244- "SEARCH_INDEXER_URL must be set in Django settings before indexing."
245- )
246-
247- secret = getattr (settings , "SEARCH_INDEXER_SECRET" , None )
248- if not secret :
249- raise RuntimeError (
250- "SEARCH_INDEXER_SECRET must be set in Django settings before indexing."
251- )
252269
253270 try :
254271 response = requests .post (
255- url ,
272+ self . indexer_url ,
256273 json = data ,
257- headers = {"Authorization" : f"Bearer { secret } " },
274+ headers = {"Authorization" : f"Bearer { self . indexer_secret } " },
258275 timeout = 10 ,
259276 )
260277 response .raise_for_status ()
261278 except requests .exceptions .HTTPError as e :
262279 logger .error ("HTTPError: %s" , e )
263- logger .error ("Response content: %s" , response .text )
264280 raise
0 commit comments