@@ -153,7 +153,6 @@ def engagement_calendar(request):
153153
154154
155155def get_filtered_engagements (request , view ):
156-
157156 if view not in {"all" , "active" }:
158157 msg = f"View { view } is not allowed"
159158 raise ValidationError (msg )
@@ -163,37 +162,29 @@ def get_filtered_engagements(request, view):
163162 if view == "active" :
164163 engagements = engagements .filter (active = True )
165164
166- engagements = engagements .select_related ("product" , "product__prod_type" ) \
165+ engagements = (
166+ engagements
167+ .select_related ("product" , "product__prod_type" )
167168 .prefetch_related ("lead" , "tags" , "product__tags" )
169+ )
168170
169171 if System_Settings .objects .get ().enable_jira :
170172 engagements = engagements .prefetch_related (
171173 "jira_project__jira_instance" ,
172174 "product__jira_project_set__jira_instance" ,
173175 )
174176
177+ test_count_subquery = build_count_subquery (
178+ Test .objects .filter (engagement = OuterRef ("pk" )), group_field = "engagement_id" ,
179+ )
180+ engagements = engagements .annotate (test_count = Coalesce (test_count_subquery , Value (0 )))
181+
175182 filter_string_matching = get_system_setting ("filter_string_matching" , False )
176183 filter_class = EngagementDirectFilterWithoutObjectLookups if filter_string_matching else EngagementDirectFilter
177184 return filter_class (request .GET , queryset = engagements )
178185
179186
180- def get_test_counts (engagements ):
181- # Get the test counts per engagement. As a separate query, this is much
182- # faster than annotating the above `engagements` query.
183- return {
184- test ["engagement" ]: test ["test_count" ]
185- for test in Test .objects .filter (
186- engagement__in = engagements ,
187- ).values (
188- "engagement" ,
189- ).annotate (
190- test_count = Count ("engagement" ),
191- )
192- }
193-
194-
195187def engagements (request , view ):
196-
197188 if not view :
198189 view = "active"
199190
@@ -211,7 +202,6 @@ def engagements(request, view):
211202 return render (
212203 request , "dojo/engagement.html" , {
213204 "engagements" : engs ,
214- "engagement_test_counts" : get_test_counts (filtered_engagements .qs ),
215205 "filter_form" : filtered_engagements .form ,
216206 "product_name_words" : product_name_words ,
217207 "engagement_name_words" : engagement_name_words ,
@@ -1589,14 +1579,18 @@ def get_engagements(request):
15891579 query = get_list_index (path_items , 1 )
15901580
15911581 request .GET = QueryDict (query )
1592- engagements = get_filtered_engagements (request , view ).qs
1593- test_counts = get_test_counts (engagements )
1594-
1595- return engagements , test_counts
1582+ return get_filtered_engagements (request , view ).qs
15961583
15971584
15981585def get_excludes ():
1599- return ["is_ci_cd" , "jira_issue" , "jira_project" , "objects" , "unaccepted_open_findings" ]
1586+ return [
1587+ "is_ci_cd" ,
1588+ "jira_issue" ,
1589+ "jira_project" ,
1590+ "objects" ,
1591+ "unaccepted_open_findings" ,
1592+ "test_count" , # already exported separately as “tests”
1593+ ]
16001594
16011595
16021596def get_foreign_keys ():
@@ -1606,7 +1600,7 @@ def get_foreign_keys():
16061600
16071601def csv_export (request ):
16081602 logger .debug ("starting csv export" )
1609- engagements , test_counts = get_engagements (request )
1603+ engagements = get_engagements (request )
16101604
16111605 response = HttpResponse (content_type = "text/csv" )
16121606 response ["Content-Disposition" ] = "attachment; filename=engagements.csv"
@@ -1633,7 +1627,7 @@ def csv_export(request):
16331627 if value and isinstance (value , str ):
16341628 value = value .replace ("\n " , " NEWLINE " ).replace ("\r " , "" )
16351629 fields .append (value )
1636- fields .append (test_counts . get (engagement . id , 0 ))
1630+ fields .append (getattr (engagement , "test_count" , 0 ))
16371631
16381632 writer .writerow (fields )
16391633 logger .debug ("done with csv export" )
@@ -1642,7 +1636,7 @@ def csv_export(request):
16421636
16431637def excel_export (request ):
16441638 logger .debug ("starting excel export" )
1645- engagements , test_counts = get_engagements (request )
1639+ engagements = get_engagements (request )
16461640
16471641 workbook = Workbook ()
16481642 workbook .iso_dates = True
@@ -1674,7 +1668,7 @@ def excel_export(request):
16741668 value = value .replace (tzinfo = None )
16751669 worksheet .cell (row = row_num , column = col_num , value = value )
16761670 col_num += 1
1677- worksheet .cell (row = row_num , column = col_num , value = test_counts . get (engagement . id , 0 ))
1671+ worksheet .cell (row = row_num , column = col_num , value = getattr (engagement , "test_count" , 0 ))
16781672 row_num += 1
16791673
16801674 with NamedTemporaryFile () as tmp :
0 commit comments