| 251 | |
| 252 | |
| 253 | def insert_advisory(advisory: AdvisoryData, pipeline_id: str, logger: Callable = None): |
| 254 | from vulnerabilities.utils import compute_content_id |
| 255 | |
| 256 | advisory_obj = None |
| 257 | aliases = get_or_create_aliases(aliases=advisory.aliases) |
| 258 | content_id = compute_content_id(advisory_data=advisory) |
| 259 | try: |
| 260 | default_data = { |
| 261 | "summary": advisory.summary, |
| 262 | "affected_packages": [pkg.to_dict() for pkg in advisory.affected_packages], |
| 263 | "references": [ref.to_dict() for ref in advisory.references], |
| 264 | "date_published": advisory.date_published, |
| 265 | "weaknesses": advisory.weaknesses, |
| 266 | "created_by": pipeline_id, |
| 267 | "date_collected": datetime.now(timezone.utc), |
| 268 | } |
| 269 | |
| 270 | advisory_obj, _ = Advisory.objects.get_or_create( |
| 271 | unique_content_id=content_id, |
| 272 | url=advisory.url, |
| 273 | defaults=default_data, |
| 274 | ) |
| 275 | advisory_obj.aliases.add(*aliases) |
| 276 | except Advisory.MultipleObjectsReturned: |
| 277 | logger.error( |
| 278 | f"Multiple Advisories returned: unique_content_id: {content_id}, url: {advisory.url}, advisory: {advisory!r}" |
| 279 | ) |
| 280 | raise |
| 281 | except Exception as e: |
| 282 | if logger: |
| 283 | logger( |
| 284 | f"Error while processing {advisory!r} with aliases {advisory.aliases!r}: {e!r} \n {traceback_format_exc()}", |
| 285 | level=logging.ERROR, |
| 286 | ) |
| 287 | |
| 288 | return advisory_obj |
| 289 | |
| 290 | |
| 291 | @transaction.atomic |