@@ -690,3 +690,112 @@ class AliasViewSet(VulnerabilityViewSet):
690690 """
691691
692692 filterset_class = AliasFilterSet
693+
694+ class WeaknessV2Serializer (serializers .ModelSerializer ):
695+ cwe_id = serializers .CharField ()
696+ name = serializers .CharField ()
697+ description = serializers .CharField ()
698+
699+ class Meta :
700+ model = Weakness
701+ fields = ["cwe_id" , "name" , "description" ]
702+
703+
704+ class VulnerabilityReferenceV2Serializer (serializers .ModelSerializer ):
705+ url = serializers .CharField ()
706+ reference_type = serializers .CharField ()
707+ reference_id = serializers .CharField ()
708+
709+ class Meta :
710+ model = VulnerabilityReference
711+ fields = ["url" , "reference_type" , "reference_id" ]
712+
713+ class VulnerabilityV2Serializer (serializers .ModelSerializer ):
714+ aliases = serializers .SerializerMethodField ()
715+ severities = serializers .SerializerMethodField ()
716+ weaknesses = WeaknessV2Serializer (many = True )
717+ references = VulnerabilityReferenceV2Serializer (many = True , source = 'vulnerabilityreference_set' )
718+
719+ class Meta :
720+ model = Vulnerability
721+ fields = [
722+ "vulnerability_id" ,
723+ "aliases" ,
724+ "summary" ,
725+ "severities" ,
726+ "weaknesses" ,
727+ "references" ,
728+ ]
729+
730+ def get_aliases (self , obj ):
731+ return [alias .alias for alias in obj .aliases .all ()]
732+
733+ def get_severities (self , obj ):
734+ #TODO: Need data model changes
735+ return []
736+
737+
738+ class VulnerabilityV2ViewSet (viewsets .ReadOnlyModelViewSet ):
739+ queryset = Vulnerability .objects .all ()
740+ serializer_class = VulnerabilityV2Serializer
741+
742+ def list (self , request , * args , ** kwargs ):
743+ queryset = self .get_queryset ()
744+ # Apply pagination
745+ page = self .paginate_queryset (queryset )
746+ if page is not None :
747+ serializer = self .get_serializer (page , many = True )
748+ data = serializer .data
749+ vulnerabilities = {item ['vulnerability_id' ]: item for item in data }
750+ # Use 'self.get_paginated_response' to include pagination data
751+ return self .get_paginated_response ({'vulnerabilities' : vulnerabilities })
752+
753+ # If pagination is not applied
754+ serializer = self .get_serializer (queryset , many = True )
755+ data = serializer .data
756+ vulnerabilities = {item ['vulnerability_id' ]: item for item in data }
757+ return Response ({'vulnerabilities' : vulnerabilities })
758+
759+
760+ class PackageV2Serializer (serializers .ModelSerializer ):
761+ purl = serializers .CharField (source = 'package_url' )
762+ affected_by_vulnerabilities = serializers .SerializerMethodField ()
763+ fixing_vulnerabilities = serializers .SerializerMethodField ()
764+ next_non_vulnerable_version = serializers .CharField (read_only = True )
765+ latest_non_vulnerable_version = serializers .CharField (read_only = True )
766+
767+ class Meta :
768+ model = Package
769+ fields = [
770+ 'purl' ,
771+ 'affected_by_vulnerabilities' ,
772+ 'fixing_vulnerabilities' ,
773+ 'next_non_vulnerable_version' ,
774+ 'latest_non_vulnerable_version' ,
775+ ]
776+
777+ def get_affected_by_vulnerabilities (self , obj ):
778+ return [vuln .vulnerability_id for vuln in obj .affected_by_vulnerabilities .all ()]
779+
780+ def get_fixing_vulnerabilities (self , obj ):
781+ return [vuln .vulnerability_id for vuln in obj .fixing_vulnerabilities .all ()]
782+
783+
784+ class PackageV2ViewSet (viewsets .ReadOnlyModelViewSet ):
785+ queryset = Package .objects .all ()
786+ serializer_class = PackageV2Serializer
787+
788+ def list (self , request , * args , ** kwargs ):
789+ queryset = self .get_queryset ().with_is_vulnerable ()
790+ # Apply pagination
791+ page = self .paginate_queryset (queryset )
792+ if page is not None :
793+ serializer = self .get_serializer (page , many = True )
794+ data = serializer .data
795+ # Use 'self.get_paginated_response' to include pagination data
796+ return self .get_paginated_response ({'purls' : data })
797+
798+ # If pagination is not applied
799+ serializer = self .get_serializer (queryset , many = True )
800+ data = serializer .data
801+ return Response ({'purls' : data })
0 commit comments