3
3
import logging
4
4
from abc import ABC , abstractmethod
5
5
from collections import defaultdict
6
+ from functools import cache
6
7
7
8
from django .conf import settings
8
9
from django .contrib .auth .models import AnonymousUser
10
+ from django .core .exceptions import ImproperlyConfigured
11
+ from django .utils .module_loading import import_string
9
12
10
13
import requests
11
14
14
17
logger = logging .getLogger (__name__ )
15
18
16
19
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
+
17
38
def get_batch_accesses_by_users_and_teams (paths ):
18
39
"""
19
40
Get accesses related to a list of document paths,
20
41
grouped by users and teams, including all ancestor paths.
21
42
"""
22
- # print("paths: ", paths)
23
43
ancestor_map = utils .get_ancestor_to_descendants_map (
24
44
paths , steplen = models .Document .steplen
25
45
)
26
46
ancestor_paths = list (ancestor_map .keys ())
27
- # print("ancestor map: ", ancestor_map)
28
- # print("ancestor paths: ", ancestor_paths)
29
47
30
48
access_qs = models .DocumentAccess .objects .filter (
31
49
document__path__in = ancestor_paths
@@ -80,6 +98,24 @@ def __init__(self, batch_size=None):
80
98
Defaults to settings.SEARCH_INDEXER_BATCH_SIZE.
81
99
"""
82
100
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
+ )
83
119
84
120
def index (self ):
85
121
"""
@@ -143,7 +179,7 @@ def search(self, text, user, token):
143
179
@abstractmethod
144
180
def search_query (self , data , token ) -> dict :
145
181
"""
146
- Retreive documents from the Find app API.
182
+ Retrieve documents from the Find app API.
147
183
148
184
Must be implemented by subclasses.
149
185
"""
@@ -204,16 +240,9 @@ def search_query(self, data, token) -> requests.Response:
204
240
Returns:
205
241
dict: A JSON-serializable dictionary.
206
242
"""
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
-
214
243
try :
215
244
response = requests .post (
216
- url ,
245
+ self . search_url ,
217
246
json = data ,
218
247
headers = {"Authorization" : f"Bearer { token } " },
219
248
timeout = 10 ,
@@ -222,7 +251,6 @@ def search_query(self, data, token) -> requests.Response:
222
251
return response .json ()
223
252
except requests .exceptions .HTTPError as e :
224
253
logger .error ("HTTPError: %s" , e )
225
- logger .error ("Response content: %s" , response .text ) # type: ignore
226
254
raise
227
255
228
256
def format_response (self , data : dict ):
@@ -238,27 +266,15 @@ def push(self, data):
238
266
Args:
239
267
data (list): List of document dictionaries.
240
268
"""
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
- )
252
269
253
270
try :
254
271
response = requests .post (
255
- url ,
272
+ self . indexer_url ,
256
273
json = data ,
257
- headers = {"Authorization" : f"Bearer { secret } " },
274
+ headers = {"Authorization" : f"Bearer { self . indexer_secret } " },
258
275
timeout = 10 ,
259
276
)
260
277
response .raise_for_status ()
261
278
except requests .exceptions .HTTPError as e :
262
279
logger .error ("HTTPError: %s" , e )
263
- logger .error ("Response content: %s" , response .text )
264
280
raise
0 commit comments