Skip to content

Commit 9702c60

Browse files
committed
Get rid of unncessary queries
Signed-off-by: Tushar Goel <[email protected]>
1 parent b6a7877 commit 9702c60

File tree

3 files changed

+28
-31
lines changed

3 files changed

+28
-31
lines changed

vulnerabilities/api.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,23 @@ def get_resource_url(self, instance):
8282
return resource_url
8383

8484

85-
class MinimalPackageSerializer(BaseResourceSerializer):
85+
class VulnVulnIDSerializer(serializers.Serializer):
8686
"""
87-
Used for nesting inside vulnerability focused APIs.
87+
Serializer for the series of vulnerability IDs.
8888
"""
8989

90-
def get_affected_vulnerabilities(self, package):
91-
affected_vulnerabilities = [
92-
self.get_vulnerability(vuln) for vuln in package.get_affecting_vulnerabilities()
93-
]
90+
vulnerability = serializers.CharField(source="vulnerability_id")
9491

95-
return affected_vulnerabilities
92+
class Meta:
93+
fields = ["vulnerability"]
9694

97-
def get_vulnerability(self, vuln):
98-
affected_vulnerability = {}
9995

100-
vulnerability = vuln.get("vulnerability")
101-
if vulnerability:
102-
affected_vulnerability["vulnerability"] = vulnerability.vulnerability_id
103-
return affected_vulnerability
96+
class MinimalPackageSerializer(BaseResourceSerializer):
97+
"""
98+
Used for nesting inside vulnerability focused APIs.
99+
"""
104100

105-
affected_by_vulnerabilities = serializers.SerializerMethodField("get_affected_vulnerabilities")
101+
affected_by_vulnerabilities = VulnVulnIDSerializer(source="affecting_vulns", many=True)
106102

107103
purl = serializers.CharField(source="package_url")
108104

vulnerabilities/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,20 @@ def affecting_vulnerabilities(self):
868868
"""
869869
return self.vulnerabilities.filter(packagerelatedvulnerability__fix=False)
870870

871+
@property
872+
def affecting_vulns(self):
873+
"""
874+
Return a queryset of Vulnerabilities that affect this `package`.
875+
"""
876+
fixed_by_packages = Package.objects.get_fixed_by_package_versions(self, fix=True)
877+
return self.vulnerabilities.affecting_vulnerabilities().prefetch_related(
878+
Prefetch(
879+
"packages",
880+
queryset=fixed_by_packages,
881+
to_attr="fixed_packages",
882+
)
883+
)
884+
871885

872886
class PackageRelatedVulnerability(models.Model):
873887
"""

vulnerabilities/tests/test_api.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -462,14 +462,14 @@ def test_api_packages_single_with_purl_in_query_num_queries(self):
462462
self.csrf_client.get(f"/api/packages/?purl={self.pkg_2_14_0_rc1.purl}", format="json")
463463

464464
def test_api_packages_single_with_purl_no_version_in_query_num_queries(self):
465-
with self.assertNumQueries(68):
465+
with self.assertNumQueries(64):
466466
self.csrf_client.get(
467467
f"/api/packages/?purl=pkg:maven/com.fasterxml.jackson.core/jackson-databind",
468468
format="json",
469469
)
470470

471471
def test_api_packages_bulk_search(self):
472-
with self.assertNumQueries(49):
472+
with self.assertNumQueries(45):
473473
packages = [self.pkg_2_12_6, self.pkg_2_12_6_1, self.pkg_2_13_1]
474474
purls = [p.purl for p in packages]
475475

@@ -482,7 +482,7 @@ def test_api_packages_bulk_search(self):
482482
).json()
483483

484484
def test_api_packages_with_lookup(self):
485-
with self.assertNumQueries(16):
485+
with self.assertNumQueries(14):
486486
data = {"purl": self.pkg_2_12_6.purl}
487487

488488
resp = self.csrf_client.post(
@@ -492,7 +492,7 @@ def test_api_packages_with_lookup(self):
492492
).json()
493493

494494
def test_api_packages_bulk_lookup(self):
495-
with self.assertNumQueries(49):
495+
with self.assertNumQueries(45):
496496
packages = [self.pkg_2_12_6, self.pkg_2_12_6_1, self.pkg_2_13_1]
497497
purls = [p.purl for p in packages]
498498

@@ -556,19 +556,6 @@ def setUp(self):
556556
set_as_affected_by(package=self.pkg_2_13_2, vulnerability=self.vul2)
557557
set_as_fixing(package=self.pkg_2_13_2, vulnerability=self.vul1)
558558

559-
def test_api_with_package_with_no_vulnerabilities(self):
560-
affected_vulnerabilities = []
561-
vuln = {
562-
"foo": "bar",
563-
}
564-
565-
package_with_no_vulnerabilities = MinimalPackageSerializer.get_vulnerability(
566-
self,
567-
vuln,
568-
)
569-
570-
assert package_with_no_vulnerabilities is None
571-
572559
def test_api_with_lesser_and_greater_fixed_by_packages(self):
573560
response = self.csrf_client.get(f"/api/packages/{self.pkg_2_13_1.id}", format="json").data
574561

0 commit comments

Comments
 (0)