Skip to content

Commit f6f89c1

Browse files
Add subquery for test_count for engagements getting
1 parent 34b4bb1 commit f6f89c1

2 files changed

Lines changed: 23 additions & 32 deletions

File tree

dojo/engagement/views.py

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ def engagement_calendar(request):
153153

154154

155155
def 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-
195187
def 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

15981585
def 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

16021596
def get_foreign_keys():
@@ -1606,7 +1600,7 @@ def get_foreign_keys():
16061600

16071601
def 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

16431637
def 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:

dojo/templates/dojo/engagement.html

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
{% load navigation_tags %}
33
{% load display_tags %}
44
{% load authorization_tags %}
5-
{% load dict_key %}
65

76
{% block content %}
87
{{ block.super }}
@@ -173,9 +172,7 @@ <h3 class="has-filters">
173172
<td>{{ e.lead.first_name }} {{ e.lead.last_name }}</td>
174173
<td>
175174
<a class="eng_link" href="{%url 'view_engagement' e.id %}#tests">
176-
{% with test_count=engagement_test_counts|dict_key:e.pk|default_if_none:0 %}
177-
{{ test_count }}
178-
{% endwith %}
175+
{{ e.test_count|default:0 }}
179176
</a>
180177
</td>
181178
{% if system_settings.enable_jira %}

0 commit comments

Comments
 (0)