|
26 | 26 |
|
27 | 27 | from django.db import models |
28 | 28 | import django.contrib.postgres.fields as pgfields |
| 29 | +from django.utils.translation import ugettext_lazy as _ |
29 | 30 |
|
30 | 31 | from packageurl.contrib.django_models import PackageURLMixin |
| 32 | +from packageurl import PackageURL |
31 | 33 |
|
32 | 34 | from vulnerabilities.data_source import DataSource |
33 | 35 |
|
@@ -77,6 +79,33 @@ class Package(PackageURLMixin): |
77 | 79 |
|
78 | 80 | class Meta: |
79 | 81 | unique_together = ('name', 'namespace', 'type', 'version', 'qualifiers', 'subpath') |
| 82 | + # Remove the `qualifers` and `set_package_url` overrides after |
| 83 | + # https://github.com/package-url/packageurl-python/pull/35 gets merged |
| 84 | + qualifiers = pgfields.JSONField( |
| 85 | + default=dict, |
| 86 | + help_text=_( |
| 87 | + 'Extra qualifying data for a package such as the name of an OS, ' |
| 88 | + 'architecture, distro, etc.' |
| 89 | + ), |
| 90 | + null=True |
| 91 | + ) |
| 92 | + |
| 93 | + def set_package_url(self, package_url): |
| 94 | + """ |
| 95 | + Set each field values to the values of the provided `package_url` string |
| 96 | + or PackageURL object. Existing values are overwritten including setting |
| 97 | + values to None for provided empty values. |
| 98 | + """ |
| 99 | + if not isinstance(package_url, PackageURL): |
| 100 | + package_url = PackageURL.from_string(package_url) |
| 101 | + |
| 102 | + for field_name, value in package_url.to_dict().items(): |
| 103 | + model_field = self._meta.get_field(field_name) |
| 104 | + |
| 105 | + if value and len(value) > model_field.max_length: |
| 106 | + raise ValidationError(_('Value too long for field "{}".'.format(field_name))) |
| 107 | + |
| 108 | + setattr(self, field_name, value or None) |
80 | 109 |
|
81 | 110 | def __str__(self): |
82 | 111 | return self.package_url |
|
0 commit comments