| 290 | |
| 291 | @transaction.atomic |
| 292 | def insert_advisory_v2( |
| 293 | advisory: AdvisoryDataV2, |
| 294 | pipeline_id: str, |
| 295 | logger: Callable, |
| 296 | datasource_id: str, |
| 297 | precedence: int = 0, |
| 298 | ): |
| 299 | from vulnerabilities.models import ImpactedPackage |
| 300 | from vulnerabilities.models import PackageV2 |
| 301 | from vulnerabilities.utils import compute_content_id_v2 |
| 302 | |
| 303 | advisory_obj = None |
| 304 | created = False |
| 305 | content_id = compute_content_id_v2(advisory_data=advisory) |
| 306 | try: |
| 307 | default_data = { |
| 308 | "datasource_id": datasource_id, |
| 309 | "pipeline_id": pipeline_id, |
| 310 | "advisory_id": advisory.advisory_id, |
| 311 | "avid": f"{datasource_id}/{advisory.advisory_id}", |
| 312 | "summary": advisory.summary, |
| 313 | "date_published": advisory.date_published, |
| 314 | "original_advisory_text": advisory.original_advisory_text, |
| 315 | "url": advisory.url, |
| 316 | "precedence": precedence, |
| 317 | } |
| 318 | |
| 319 | advisory_obj, created = AdvisoryV2.objects.get_or_create( |
| 320 | advisory_id=advisory.advisory_id, |
| 321 | datasource_id=datasource_id, |
| 322 | pipeline_id=pipeline_id, |
| 323 | unique_content_id=content_id, |
| 324 | defaults=default_data, |
| 325 | ) |
| 326 | except AdvisoryV2.MultipleObjectsReturned: |
| 327 | logger( |
| 328 | f"Multiple Advisories returned: unique_content_id: {content_id}, url: {advisory.url}, advisory: {advisory!r}" |
| 329 | ) |
| 330 | raise |
| 331 | except Exception as e: |
| 332 | logger( |
| 333 | f"Error while processing {advisory!r} with aliases {advisory.aliases!r}: {e!r} \n {traceback_format_exc()}", |
| 334 | level=logging.ERROR, |
| 335 | ) |
| 336 | raise |
| 337 | |
| 338 | if not created: |
| 339 | return advisory_obj |
| 340 | |
| 341 | AdvisoryV2.objects.filter( |
| 342 | avid=f"{datasource_id}/{advisory.advisory_id}", |
| 343 | is_latest=True, |
| 344 | ).update(is_latest=False) |
| 345 | advisory_obj.is_latest = True |
| 346 | advisory_obj.save() |
| 347 | |
| 348 | aliases = get_or_create_advisory_aliases(aliases=advisory.aliases) |
| 349 | references = get_or_create_advisory_references(references=advisory.references) |