Skip to content

Commit c3c9295

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

3 files changed

Lines changed: 19 additions & 12 deletions

File tree

vulnerabilities/templates/package_update.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ <h1 class="title">
4040
<div class="tags mx-3">
4141
{% for vulnerability in impacted_vuln %}
4242
<span class="tag is-danger is-medium">
43-
<a href="{% url 'vulnerability_view' vulnerability.pk %}" class="has-text-white">{{vulnerability}}</a>
43+
<a href="{% url 'vulnerability_view' vulnerability.pk %}" class="has-text-white">{{vulnerability.vulnerability_id}}</a>
4444
{% if enable_curation %}
4545
<form method="POST" action="{% url 'impacted_package_delete' object.pk vulnerability.pk %}"">
4646
{% csrf_token %}<button class="delete is-small" type="submit"></button>
@@ -74,7 +74,7 @@ <h1 class="title">
7474
<div class="tags mx-3">
7575
{% for vulnerability in resolved_vuln %}
7676
<span class="tag is-primary is-medium">
77-
<a href="{% url 'vulnerability_view' vulnerability.pk %}" class="has-text-white">{{vulnerability}}</a>
77+
<a href="{% url 'vulnerability_view' vulnerability.pk %}" class="has-text-white">{{vulnerability.vulnerability_id}}</a>
7878

7979
{% if enable_curation %}
8080
<form method="POST" action="{% url 'resolved_package_delete' object.pk vulnerability.pk %}">

vulnerabilities/templates/packages.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ <h1 class="title">
4141
</tr>
4242
{% for package in packages %}
4343
<tr>
44-
<td><a href="{% url 'package_view' package.pk %}">{{package}}</a></td>
45-
<td>{{package.vulnerable_to.all|length}}</td>
46-
<td>{{package.resolved_to.all|length}}</td>
44+
<td><a href="{% url 'package_view' package.pk %}">{{package.package_url}}</a></td>
45+
<td>{{package.vulnerability_count}}</td>
46+
<td>{{package.patched_vulnerability_count}}</td>
4747
</tr>
4848
{% endfor %}
4949
</table>

vulnerabilities/views.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def get(self, request):
4747

4848
if request.GET:
4949
packages = self.request_to_queryset(request)
50-
result_size = packages.count()
50+
result_size = len(packages)
5151
page_no = int(request.GET.get("page", 1))
5252
packages = Paginator(packages, 50).get_page(page_no)
5353
context["packages"] = packages
@@ -69,9 +69,14 @@ def request_to_queryset(request):
6969
if len(request.GET["name"]):
7070
package_name = request.GET["name"]
7171

72-
return models.Package.objects.all().filter(
73-
name__icontains=package_name,
74-
type__icontains=package_type,
72+
return list(
73+
models.Package.objects.all()
74+
.filter(name__icontains=package_name, type__icontains=package_type)
75+
.annotate(
76+
vulnerability_count=Count("vulnerabilities"),
77+
patched_vulnerability_count=Count("resolved_vulnerabilities"),
78+
)
79+
.prefetch_related()
7580
)
7681

7782

@@ -118,9 +123,11 @@ def get_context_data(self, **kwargs):
118123
return context
119124

120125
def _package_vulnerabilities(self, package_pk):
121-
122-
resolved_vuln = [i for i in self.get_object().resolved_to]
123-
unresolved_vuln = [i for i in self.get_object().vulnerable_to]
126+
# This can be further optimised by caching get_object result first time it
127+
# is called
128+
package = self.get_object()
129+
resolved_vuln = [i for i in package.resolved_to.values("vulnerability_id", "pk")]
130+
unresolved_vuln = [i for i in package.vulnerable_to.values("vulnerability_id", "pk")]
124131

125132
return resolved_vuln, unresolved_vuln
126133

0 commit comments

Comments
 (0)