1818from django .db .models .query import QuerySet
1919
2020from vulnerabilities .importer import AdvisoryData
21+ from vulnerabilities .importer import AdvisoryDataV2
2122from vulnerabilities .improver import MAX_CONFIDENCE
2223from vulnerabilities .models import Advisory
24+ from vulnerabilities .models import AdvisoryAlias
25+ from vulnerabilities .models import AdvisoryV2
2326from vulnerabilities .models import AffectedByPackageRelatedVulnerability
2427from vulnerabilities .models import Alias
2528from vulnerabilities .models import FixingPackageRelatedVulnerability
@@ -36,6 +39,12 @@ def get_or_create_aliases(aliases: List) -> QuerySet:
3639 return Alias .objects .filter (alias__in = aliases )
3740
3841
42+ def get_or_create_aliases_v2 (aliases : List ) -> QuerySet :
43+ for alias in aliases :
44+ AdvisoryAlias .objects .get_or_create (alias = alias )
45+ return AdvisoryAlias .objects .filter (alias__in = aliases )
46+
47+
3948def insert_advisory (advisory : AdvisoryData , pipeline_id : str , logger : Callable = None ):
4049 from vulnerabilities .utils import compute_content_id
4150
@@ -74,6 +83,42 @@ def insert_advisory(advisory: AdvisoryData, pipeline_id: str, logger: Callable =
7483 return advisory_obj
7584
7685
86+ def insert_advisory_v2 (advisory : AdvisoryDataV2 , pipeline_id : str , logger : Callable = None ):
87+ from vulnerabilities .utils import compute_content_id
88+
89+ advisory_obj = None
90+ aliases = get_or_create_aliases_v2 (aliases = advisory .aliases )
91+ content_id = compute_content_id (advisory_data = advisory )
92+ try :
93+ default_data = {
94+ "summary" : advisory .summary ,
95+ "date_published" : advisory .date_published ,
96+ "created_by" : pipeline_id ,
97+ "date_collected" : datetime .now (timezone .utc ),
98+ "advisory_id" : advisory .advisory_id ,
99+ }
100+
101+ advisory_obj , _ = AdvisoryV2 .objects .get_or_create (
102+ unique_content_id = content_id ,
103+ url = advisory .url ,
104+ defaults = default_data ,
105+ )
106+ advisory_obj .aliases .add (* aliases )
107+ except Advisory .MultipleObjectsReturned :
108+ logger .error (
109+ f"Multiple Advisories returned: unique_content_id: { content_id } , url: { advisory .url } , advisory: { advisory !r} "
110+ )
111+ raise
112+ except Exception as e :
113+ if logger :
114+ logger (
115+ f"Error while processing { advisory !r} with aliases { advisory .aliases !r} : { e !r} \n { traceback_format_exc ()} " ,
116+ level = logging .ERROR ,
117+ )
118+
119+ return advisory_obj
120+
121+
77122@transaction .atomic
78123def import_advisory (
79124 advisory : Advisory ,
0 commit comments