3
3
from typing import Optional
4
4
5
5
import waffle
6
- from asgiref .sync import sync_to_async
6
+ from asgiref .sync import async_to_sync , sync_to_async
7
7
from django .conf import settings
8
8
from django .http import HttpRequest , HttpResponse , JsonResponse
9
- from django .shortcuts import get_object_or_404 , render
10
- from django .template import TemplateDoesNotExist
9
+ from django .shortcuts import aget_object_or_404 # type: ignore[attr-defined]
11
10
from django .template .response import TemplateResponse
12
11
from django .views .decorators .cache import cache_page
13
12
from requests import Session
31
30
logger = logging .getLogger (__name__ )
32
31
33
32
34
- def annotate_courts_with_counts (courts , court_count_tuples ):
33
+ async def annotate_courts_with_counts (courts , court_count_tuples ):
35
34
"""Solr gives us a response like:
36
35
37
36
court_count_tuples = [
@@ -47,54 +46,60 @@ def annotate_courts_with_counts(courts, court_count_tuples):
47
46
for court_str , count in court_count_tuples :
48
47
court_count_dict [court_str ] = count
49
48
50
- for court in courts :
49
+ async for court in courts :
51
50
court .count = court_count_dict .get (court .pk , 0 )
52
51
53
52
return courts
54
53
55
54
56
- def make_court_variable ():
55
+ async def make_court_variable ():
57
56
courts = Court .objects .exclude (jurisdiction = Court .TESTING_COURT )
58
- with Session () as session :
59
- si = ExtraSolrInterface (
60
- settings .SOLR_OPINION_URL , http_connection = session , mode = "r"
61
- )
62
- response = si .query ().add_extra (** build_court_count_query ()).execute ()
57
+
58
+ @sync_to_async
59
+ def court_count_query ():
60
+ with Session () as session :
61
+ si = ExtraSolrInterface (
62
+ settings .SOLR_OPINION_URL , http_connection = session , mode = "r"
63
+ )
64
+ return si .query ().add_extra (** build_court_count_query ()).execute ()
65
+
66
+ response = await court_count_query ()
63
67
court_count_tuples = response .facet_counts .facet_fields ["court_exact" ]
64
- courts = annotate_courts_with_counts (courts , court_count_tuples )
68
+ courts = await annotate_courts_with_counts (courts , court_count_tuples )
65
69
return courts
66
70
67
71
68
- def court_index (request : HttpRequest ) -> HttpResponse :
72
+ async def court_index (request : HttpRequest ) -> HttpResponse :
69
73
"""Shows the information we have available for the courts."""
70
- courts = make_court_variable ()
71
- return render (
74
+ courts = await make_court_variable ()
75
+ return TemplateResponse (
72
76
request , "jurisdictions.html" , {"courts" : courts , "private" : False }
73
77
)
74
78
75
79
76
- def rest_docs (request , version = None ):
80
+ async def rest_docs (request , version = None ):
77
81
"""Show the correct version of the rest docs"""
78
- courts = make_court_variable ()
82
+ courts = await make_court_variable ()
79
83
court_count = len (courts )
80
84
context = {"court_count" : court_count , "courts" : courts , "private" : False }
81
- try :
82
- return render (request , f"rest-docs-{ version } .html" , context )
83
- except TemplateDoesNotExist :
84
- return render (request , "rest-docs-vlatest.html" , context )
85
+ return TemplateResponse (
86
+ request ,
87
+ [f"rest-docs-{ version } .html" , "rest-docs-vlatest.html" ],
88
+ context ,
89
+ )
85
90
86
91
87
- def api_index (request : HttpRequest ) -> HttpResponse :
88
- court_count = Court .objects .exclude (
92
+ async def api_index (request : HttpRequest ) -> HttpResponse :
93
+ court_count = await Court .objects .exclude (
89
94
jurisdiction = Court .TESTING_COURT
90
- ).count ()
91
- return render (
95
+ ).acount ()
96
+ return TemplateResponse (
92
97
request , "docs.html" , {"court_count" : court_count , "private" : False }
93
98
)
94
99
95
100
96
- def replication_docs (request : HttpRequest ) -> HttpResponse :
97
- return render (request , "replication.html" , {"private" : False })
101
+ async def replication_docs (request : HttpRequest ) -> HttpResponse :
102
+ return TemplateResponse (request , "replication.html" , {"private" : False })
98
103
99
104
100
105
async def bulk_data_index (request : HttpRequest ) -> HttpResponse :
@@ -131,27 +136,32 @@ def strip_zero_years(data):
131
136
return data [start : end + 1 ]
132
137
133
138
134
- def coverage_data (request , version , court ):
139
+ async def coverage_data (request , version , court ):
135
140
"""Provides coverage data for a court.
136
141
137
142
Responds to either AJAX or regular requests.
138
143
"""
139
144
140
145
if court != "all" :
141
- court_str = get_object_or_404 ( Court , pk = court ).pk
146
+ court_str = ( await aget_object_or_404 ( Court , pk = court ) ).pk
142
147
else :
143
148
court_str = "all"
144
149
q = request .GET .get ("q" )
145
- with Session () as session :
146
- si = ExtraSolrInterface (
147
- settings .SOLR_OPINION_URL , http_connection = session , mode = "r"
148
- )
149
- facet_field = "dateFiled"
150
- response = (
151
- si .query ()
152
- .add_extra (** build_coverage_query (court_str , q , facet_field ))
153
- .execute ()
154
- )
150
+
151
+ @sync_to_async
152
+ def query_facets (c_str , q_str ):
153
+ with Session () as session :
154
+ si = ExtraSolrInterface (
155
+ settings .SOLR_OPINION_URL , http_connection = session , mode = "r"
156
+ )
157
+ facet_field = "dateFiled"
158
+ return facet_field , (
159
+ si .query ()
160
+ .add_extra (** build_coverage_query (c_str , q_str , facet_field ))
161
+ .execute ()
162
+ )
163
+
164
+ facet_field , response = await query_facets (court_str , q )
155
165
counts = response .facet_counts .facet_ranges [facet_field ]["counts" ]
156
166
counts = strip_zero_years (counts )
157
167
@@ -167,7 +177,7 @@ def coverage_data(request, version, court):
167
177
)
168
178
169
179
170
- def fetch_first_last_date_filed (
180
+ async def fetch_first_last_date_filed (
171
181
court_id : str ,
172
182
) -> tuple [Optional [date ], Optional [date ]]:
173
183
"""Fetch first and last date for court
@@ -178,14 +188,16 @@ def fetch_first_last_date_filed(
178
188
query = OpinionCluster .objects .filter (docket__court = court_id ).order_by (
179
189
"date_filed"
180
190
)
181
- first , last = query .first (), query .last ()
191
+ first , last = await query .afirst (), await query .alast ()
182
192
if first :
183
193
return first .date_filed , last .date_filed
184
194
return None , None
185
195
186
196
197
+ @sync_to_async
187
198
@cache_page (7 * 60 * 60 * 24 , key_prefix = "coverage" )
188
- def coverage_data_opinions (request : HttpRequest ):
199
+ @async_to_sync
200
+ async def coverage_data_opinions (request : HttpRequest ):
189
201
"""Generate Coverage Chart Data
190
202
191
203
Accept GET to query court data for timelines-chart on coverage page
@@ -196,7 +208,7 @@ def coverage_data_opinions(request: HttpRequest):
196
208
chart_data = []
197
209
if request .method == "GET" :
198
210
court_ids = request .GET .get ("court_ids" ).split ("," ) # type: ignore
199
- chart_data = build_chart_data (court_ids )
211
+ chart_data = await sync_to_async ( build_chart_data ) (court_ids )
200
212
return JsonResponse (chart_data , safe = False )
201
213
202
214
@@ -235,21 +247,26 @@ async def get_result_count(request, version, day_count):
235
247
s , _ = await sync_to_async (build_es_base_query )(search_query , cd )
236
248
total_query_results = s .count ()
237
249
else :
238
- with Session () as session :
239
- try :
240
- si = get_solr_interface (cd , http_connection = session )
241
- except NotImplementedError :
242
- logger .error (
243
- "Tried getting solr connection for %s, but it's not "
244
- "implemented yet" ,
245
- cd ["type" ],
246
- )
247
- raise
248
- extra = await sync_to_async (build_alert_estimation_query )(
249
- cd , int (day_count )
250
- )
251
- response = si .query ().add_extra (** extra ).execute ()
252
- total_query_results = response .result .numFound
250
+
251
+ @sync_to_async
252
+ def get_total_query_results (cleaned_data , dc ):
253
+ with Session () as session :
254
+ try :
255
+ si = get_solr_interface (
256
+ cleaned_data , http_connection = session
257
+ )
258
+ except NotImplementedError :
259
+ logger .error (
260
+ "Tried getting solr connection for %s, but it's not "
261
+ "implemented yet" ,
262
+ cleaned_data ["type" ],
263
+ )
264
+ raise
265
+ extra = build_alert_estimation_query (cleaned_data , int (dc ))
266
+ response = si .query ().add_extra (** extra ).execute ()
267
+ return response .result .numFound
268
+
269
+ total_query_results = await get_total_query_results (cd , day_count )
253
270
return JsonResponse ({"count" : total_query_results }, safe = True )
254
271
255
272
@@ -267,21 +284,22 @@ async def deprecated_api(request, v):
267
284
)
268
285
269
286
270
- def rest_change_log (request ):
287
+ async def rest_change_log (request ):
271
288
context = {"private" : False }
272
- return render (request , "rest-change-log.html" , context )
289
+ return TemplateResponse (request , "rest-change-log.html" , context )
273
290
274
291
275
- def webhooks_getting_started (request ):
292
+ async def webhooks_getting_started (request ):
276
293
context = {"private" : False }
277
- return render (request , "webhooks-getting-started.html" , context )
294
+ return TemplateResponse (request , "webhooks-getting-started.html" , context )
278
295
279
296
280
- def webhooks_docs (request , version = None ):
297
+ async def webhooks_docs (request , version = None ):
281
298
"""Show the correct version of the webhooks docs"""
282
299
283
300
context = {"private" : False }
284
- try :
285
- return render (request , f"webhooks-docs-{ version } .html" , context )
286
- except TemplateDoesNotExist :
287
- return render (request , "webhooks-docs-vlatest.html" , context )
301
+ return TemplateResponse (
302
+ request ,
303
+ [f"webhooks-docs-{ version } .html" , "webhooks-docs-vlatest.html" ],
304
+ context ,
305
+ )
0 commit comments