@@ -2538,19 +2538,17 @@ def create_from_url(cls, url, user):
25382538 )
25392539
25402540 # Matching in PurlDB early to avoid more processing in case of a match.
2541- purldb_data = None
2541+ purldb_entry = None
25422542 if user .dataspace .enable_purldb_access :
25432543 package_for_match = cls (download_url = download_url )
25442544 package_for_match .set_package_url (package_url )
25452545 purldb_entries = package_for_match .get_purldb_entries (user )
25462546 # Look for one with the same exact purl in that case
2547- if purldb_data := pick_purldb_entry (purldb_entries , purl = url ):
2548- # The format from PurlDB is "2019-11-18T00:00:00Z" from DateTimeField
2549- if release_date := purldb_data .get ("release_date" ):
2550- purldb_data ["release_date" ] = release_date .split ("T" )[0 ]
2551- package_data .update (purldb_data )
2547+ if purldb_entry := pick_purldb_entry (purldb_entries , purl = url ):
2548+ cls .clean_purldb_entry (purldb_entry )
2549+ package_data .update (purldb_entry )
25522550
2553- if download_url and not purldb_data :
2551+ if download_url and not purldb_entry :
25542552 package_data = download .collect_package_data (download_url )
25552553
25562554 # 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):
26302628
26312629 return purldb_entries
26322630
2631+ @classmethod
2632+ def normalize_purldb_release_date (cls , data ):
2633+ """Strip the time portion from a PurlDB DateTimeField value."""
2634+ if release_date := data .get ("release_date" ):
2635+ data ["release_date" ] = release_date .split ("T" )[0 ]
2636+
2637+ @classmethod
2638+ def convert_purldb_package_content_label (cls , data ):
2639+ """Convert package_content from a string label to its integer value in place."""
2640+ if content_label := data .get ("package_content" ):
2641+ if content_value := Package .get_package_content_value_from_label (content_label ):
2642+ data ["package_content" ] = content_value
2643+
2644+ @classmethod
2645+ def clean_purldb_entry (cls , data ):
2646+ """Normalize PurlDB entry data for local use."""
2647+ cls .normalize_purldb_release_date (data )
2648+ cls .convert_purldb_package_content_label (data )
2649+ # Set the declared_license_expression as the "concluded" license_expression
2650+ data ["license_expression" ] = data .get ("declared_license_expression" )
2651+
26332652 def update_from_purldb (self , user ):
26342653 """
26352654 Update this Package instance with data from PurlDB.
@@ -2653,14 +2672,7 @@ def update_from_purldb(self, user):
26532672 else :
26542673 package_data = merge_common_non_empty_values (purldb_entries )
26552674
2656- # The format from PURLDB is "2019-11-18T00:00:00Z"
2657- if release_date := package_data .get ("release_date" ):
2658- package_data ["release_date" ] = release_date .split ("T" )[0 ]
2659- package_data ["license_expression" ] = package_data .get ("declared_license_expression" )
2660-
2661- if package_content := package_data .get ("package_content" ):
2662- package_content_value = Package .get_package_content_value_from_label (package_content )
2663- package_data ["package_content" ] = package_content_value
2675+ self .clean_purldb_entry (package_data )
26642676
26652677 # Avoid raising an IntegrityError when the values in `package_data` for the
26662678 # identifier fields already exist on another Package instance.
0 commit comments