Skip to content

Commit 3d28b8c

Browse files
committed
Reduce queries in vulnerability search
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent d7d3206 commit 3d28b8c

2 files changed

Lines changed: 14 additions & 7 deletions

File tree

vulnerabilities/templates/vulnerabilities.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ <h1 class="title">
3737
{% for vulnerability in vulnerabilities %}
3838
<tr>
3939
<td><a href="{% url 'vulnerability_view' vulnerability.pk %}">{{vulnerability.vulnerability_id}}</a></td>
40-
<td>{{vulnerability.vulnerable_to.all|length}}</td>
41-
<td>{{vulnerability.resolved_to.all|length}}</td>
40+
<td>{{vulnerability.vulnerable_package_count}}</td>
41+
<td>{{vulnerability.patched_package_count}}</td>
4242
</tr>
4343
{% endfor %}
4444
</table>

vulnerabilities/views.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from urllib.parse import urlencode
2424

2525
from django.core.paginator import Paginator
26+
from django.db.models import Count
2627
from django.http import HttpResponse
2728
from django.shortcuts import render, redirect
2829
from django.urls import reverse
@@ -81,8 +82,8 @@ class VulnerabilitySearchView(View):
8182
def get(self, request):
8283
context = {"form": forms.CVEForm(request.GET or None)}
8384
if request.GET:
84-
vulnerabilities = self.request_to_queryset(request)
85-
result_size = vulnerabilities.count()
85+
vulnerabilities = self.request_to_vulnerabilities(request)
86+
result_size = len(vulnerabilities)
8687
pages = Paginator(vulnerabilities, 50)
8788
vulnerabilities = pages.get_page(int(self.request.GET.get("page", 1)))
8889
context["vulnerabilities"] = vulnerabilities
@@ -91,9 +92,14 @@ def get(self, request):
9192
return render(request, self.template_name, context)
9293

9394
@staticmethod
94-
def request_to_queryset(request):
95+
def request_to_vulnerabilities(request):
9596
vuln_id = request.GET["vuln_id"]
96-
return models.Vulnerability.objects.filter(vulnerability_id__icontains=vuln_id)
97+
return list(
98+
models.Vulnerability.objects.filter(vulnerability_id__icontains=vuln_id).annotate(
99+
vulnerable_package_count=Count("vulnerable_packages"),
100+
patched_package_count=Count("patched_packages"),
101+
)
102+
)
97103

98104

99105
class PackageUpdate(UpdateView):
@@ -214,9 +220,10 @@ def relationship_already_exists(relationship):
214220
@staticmethod
215221
def create_relationship_instance(vulnerability_id, package_id, is_vulnerable):
216222
package = models.Package.objects.get(id=package_id)
223+
# FIXME: Handle the case when vuln_created=True
217224
vulnerability, vuln_created = models.Vulnerability.objects.get_or_create(
218225
vulnerability_id=vulnerability_id
219-
) # nopep8
226+
)
220227
return models.PackageRelatedVulnerability(
221228
vulnerability=vulnerability, package=package, is_vulnerable=is_vulnerable
222229
)

0 commit comments

Comments
 (0)