Skip to content

Commit adf47c6

Browse files
committed
Remove functions from API and add in model properties
Signed-off-by: Tushar Goel <[email protected]>
1 parent b51f23e commit adf47c6

File tree

3 files changed

+58
-16
lines changed

3 files changed

+58
-16
lines changed

vulnerabilities/api.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,19 +222,20 @@ class PackageSerializer(BaseResourceSerializer):
222222
Lookup software package using Package URLs
223223
"""
224224

225-
next_non_vulnerable_version = serializers.SerializerMethodField("get_next_non_vulnerable")
225+
next_non_vulnerable_version = serializers.CharField(read_only=True)
226+
latest_non_vulnerable_version = serializers.CharField(read_only=True)
226227

227-
def get_next_non_vulnerable(self, package):
228-
next_non_vulnerable = package.fixed_package_details.get("next_non_vulnerable", None)
229-
if next_non_vulnerable:
230-
return next_non_vulnerable.version
228+
# def get_next_non_vulnerable(self, package):
229+
# next_non_vulnerable = package.fixed_package_details.get("next_non_vulnerable", None)
230+
# if next_non_vulnerable:
231+
# return next_non_vulnerable.version
231232

232-
latest_non_vulnerable_version = serializers.SerializerMethodField("get_latest_non_vulnerable")
233+
# latest_non_vulnerable_version = serializers.SerializerMethodField("get_latest_non_vulnerable")
233234

234-
def get_latest_non_vulnerable(self, package):
235-
latest_non_vulnerable = package.fixed_package_details.get("latest_non_vulnerable", None)
236-
if latest_non_vulnerable:
237-
return latest_non_vulnerable.version
235+
# def get_latest_non_vulnerable(self, package):
236+
# latest_non_vulnerable = package.fixed_package_details.get("latest_non_vulnerable", None)
237+
# if latest_non_vulnerable:
238+
# return latest_non_vulnerable.version
238239

239240
purl = serializers.CharField(source="package_url")
240241

vulnerabilities/models.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,47 @@ def version_class(self):
710710
@cached_property
711711
def current_version(self):
712712
return self.version_class(self.version)
713+
714+
@property
715+
def next_non_vulnerable_version(self):
716+
"""
717+
Return the version string of the next non-vulnerable package version.
718+
"""
719+
next_non_vulnerable, _ = self.get_non_vulnerable_versions()
720+
return next_non_vulnerable.version if next_non_vulnerable else None
721+
722+
@property
723+
def latest_non_vulnerable_version(self):
724+
"""
725+
Return the version string of the latest non-vulnerable package version.
726+
"""
727+
_, latest_non_vulnerable = self.get_non_vulnerable_versions()
728+
return latest_non_vulnerable.version if latest_non_vulnerable else None
729+
730+
def get_non_vulnerable_versions(self):
731+
"""
732+
Return a tuple of the next and latest non-vulnerable versions as PackageURL objects.
733+
Return a tuple of (None, None) if there is no non-vulnerable version.
734+
"""
735+
non_vulnerable_versions = Package.objects.get_fixed_by_package_versions(
736+
self, fix=False
737+
).only_non_vulnerable()
738+
sorted_versions = self.sort_by_version(non_vulnerable_versions)
739+
740+
later_non_vulnerable_versions = [
741+
non_vuln_ver
742+
for non_vuln_ver in sorted_versions
743+
if self.version_class(non_vuln_ver.version) > self.current_version
744+
]
745+
746+
if later_non_vulnerable_versions:
747+
sorted_versions = self.sort_by_version(later_non_vulnerable_versions)
748+
next_non_vulnerable_version = sorted_versions[0]
749+
latest_non_vulnerable_version = sorted_versions[-1]
750+
751+
return next_non_vulnerable_version, latest_non_vulnerable_version
752+
753+
return None, None
713754

714755
@property
715756
def fixed_package_details(self):

vulnerabilities/tests/test_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,22 +454,22 @@ def test_api_packages_all_num_queries(self):
454454
]
455455

456456
def test_api_packages_single_num_queries(self):
457-
with self.assertNumQueries(10):
457+
with self.assertNumQueries(8):
458458
self.csrf_client.get(f"/api/packages/{self.pkg_2_14_0_rc1.id}", format="json")
459459

460460
def test_api_packages_single_with_purl_in_query_num_queries(self):
461-
with self.assertNumQueries(11):
461+
with self.assertNumQueries(9):
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(88):
465+
with self.assertNumQueries(68):
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(63):
472+
with self.assertNumQueries(49):
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(18):
485+
with self.assertNumQueries(16):
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(63):
495+
with self.assertNumQueries(49):
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

0 commit comments

Comments
 (0)