| 692 | |
| 693 | @classmethod |
| 694 | def from_dict(cls, advisory_data): |
| 695 | date_published = advisory_data["date_published"] |
| 696 | transformed = { |
| 697 | "advisory_id": advisory_data["advisory_id"], |
| 698 | "aliases": advisory_data["aliases"], |
| 699 | "summary": advisory_data["summary"], |
| 700 | "affected_packages": [ |
| 701 | AffectedPackageV2.from_dict(pkg) |
| 702 | for pkg in advisory_data["affected_packages"] |
| 703 | if pkg is not None |
| 704 | ], |
| 705 | "patches": [PatchData.from_dict(patch) for patch in advisory_data.get("patches", [])], |
| 706 | "references": [ReferenceV2.from_dict(ref) for ref in advisory_data["references"]], |
| 707 | "date_published": ( |
| 708 | datetime.datetime.fromisoformat(date_published) if date_published else None |
| 709 | ), |
| 710 | "weaknesses": advisory_data["weaknesses"], |
| 711 | "severities": [ |
| 712 | VulnerabilitySeverity.from_dict(sev) for sev in advisory_data.get("severities", []) |
| 713 | ], |
| 714 | "url": advisory_data.get("url") or None, |
| 715 | } |
| 716 | return cls(**transformed) |
| 717 | |
| 718 | |
| 719 | def clean_summary(summary): |