diff --git a/component_catalog/models.py b/component_catalog/models.py index 99a00ec8..55902b65 100644 --- a/component_catalog/models.py +++ b/component_catalog/models.py @@ -2538,19 +2538,17 @@ def create_from_url(cls, url, user): ) # Matching in PurlDB early to avoid more processing in case of a match. - purldb_data = None + purldb_entry = None if user.dataspace.enable_purldb_access: package_for_match = cls(download_url=download_url) package_for_match.set_package_url(package_url) purldb_entries = package_for_match.get_purldb_entries(user) # Look for one with the same exact purl in that case - if purldb_data := pick_purldb_entry(purldb_entries, purl=url): - # The format from PurlDB is "2019-11-18T00:00:00Z" from DateTimeField - if release_date := purldb_data.get("release_date"): - purldb_data["release_date"] = release_date.split("T")[0] - package_data.update(purldb_data) + if purldb_entry := pick_purldb_entry(purldb_entries, purl=url): + cls.clean_purldb_entry(purldb_entry) + package_data.update(purldb_entry) - if download_url and not purldb_data: + if download_url and not purldb_entry: package_data = download.collect_package_data(download_url) # Check for existing package by hash fields with a single database query @@ -2630,6 +2628,27 @@ def get_purldb_entries(self, user, max_request_call=0, timeout=10): return purldb_entries + @classmethod + def normalize_purldb_release_date(cls, data): + """Strip the time portion from a PurlDB DateTimeField value.""" + if release_date := data.get("release_date"): + data["release_date"] = release_date.split("T")[0] + + @classmethod + def convert_purldb_package_content_label(cls, data): + """Convert package_content from a string label to its integer value in place.""" + if content_label := data.get("package_content"): + if content_value := Package.get_package_content_value_from_label(content_label): + data["package_content"] = content_value + + @classmethod + def clean_purldb_entry(cls, data): + """Normalize PurlDB entry data for local use.""" + cls.normalize_purldb_release_date(data) + cls.convert_purldb_package_content_label(data) + # Set the declared_license_expression as the "concluded" license_expression + data["license_expression"] = data.get("declared_license_expression") + def update_from_purldb(self, user): """ Update this Package instance with data from PurlDB. @@ -2653,14 +2672,7 @@ def update_from_purldb(self, user): else: package_data = merge_common_non_empty_values(purldb_entries) - # The format from PURLDB is "2019-11-18T00:00:00Z" - if release_date := package_data.get("release_date"): - package_data["release_date"] = release_date.split("T")[0] - package_data["license_expression"] = package_data.get("declared_license_expression") - - if package_content := package_data.get("package_content"): - package_content_value = Package.get_package_content_value_from_label(package_content) - package_data["package_content"] = package_content_value + self.clean_purldb_entry(package_data) # Avoid raising an IntegrityError when the values in `package_data` for the # identifier fields already exist on another Package instance. diff --git a/component_catalog/tests/test_models.py b/component_catalog/tests/test_models.py index 6e348beb..ecb9fdc5 100644 --- a/component_catalog/tests/test_models.py +++ b/component_catalog/tests/test_models.py @@ -1764,6 +1764,7 @@ def test_package_model_create_from_url_enable_purldb_access( "sha1": "a2363646a9dd05955633b450010b59a21af8a423", "declared_license_expression": "bsd-new OR epl-1.0 OR apache-2.0", "package_url": "pkg:maven/abbot/abbot@1.4.0", + "package_content": "source_archive", } mock_get_purldb_entries.return_value = [purldb_entry] @@ -1773,6 +1774,7 @@ def test_package_model_create_from_url_enable_purldb_access( self.assertEqual(self.user, package.created_by) self.assertEqual(purldb_entry["declared_license_expression"], package.license_expression) + self.assertEqual("source_archive", package.get_package_content_display()) for field_name, value in purldb_entry.items(): self.assertEqual(value, getattr(package, field_name)) diff --git a/component_catalog/tests/test_views.py b/component_catalog/tests/test_views.py index 4cfd9f18..d67beecd 100644 --- a/component_catalog/tests/test_views.py +++ b/component_catalog/tests/test_views.py @@ -3404,7 +3404,7 @@ def test_component_catalog_package_add_view_initial_data( expected = { "filename": "abbot-1.4.0.jar", "keywords": ["keyword1", "keyword2"], - "release_date": "2010-05-24T00:00:00Z", + "release_date": "2010-05-24", "type": "maven", "namespace": "abbot", "name": "abbot", diff --git a/component_catalog/views.py b/component_catalog/views.py index 775bf3b6..dd4d9848 100644 --- a/component_catalog/views.py +++ b/component_catalog/views.py @@ -1931,13 +1931,7 @@ def get_initial(self): initial = super().get_initial() if purldb_entry := self.get_entry_from_purldb(): - # Duplicate the declared_license_expression as the "concluded" license_expression - purldb_entry["license_expression"] = purldb_entry.get("declared_license_expression") - - # Convert package_content string label to integer value - if content_label := purldb_entry.pop("package_content", None): - if content_value := Package.get_package_content_value_from_label(content_label): - purldb_entry["package_content"] = content_value + self.model.clean_purldb_entry(purldb_entry) model_fields = [field.name for field in Package._meta.get_fields()] initial_from_purldb_entry = {