@@ -83,6 +83,10 @@ class RunInProgressError(Exception):
83
83
"""Run are in progress or queued on this project."""
84
84
85
85
86
+ # PackageURL._fields
87
+ PURL_FIELDS = ("type" , "namespace" , "name" , "version" , "qualifiers" , "subpath" )
88
+
89
+
86
90
class UUIDPKModel (models .Model ):
87
91
uuid = models .UUIDField (
88
92
verbose_name = _ ("UUID" ),
@@ -1006,6 +1010,39 @@ def add_errors(self, errors):
1006
1010
self .add_error (error )
1007
1011
1008
1012
1013
+ class UpdateFromDataMixin :
1014
+ """
1015
+ Adds a method to update an object instance from a `data` dict.
1016
+ """
1017
+
1018
+ def update_from_data (self , data , override = False ):
1019
+ """
1020
+ Update this object instance with the provided `data`.
1021
+ The `save()` is called only if at least one field was modified.
1022
+ """
1023
+ model_fields = self .__class__ .model_fields ()
1024
+ updated_fields = []
1025
+
1026
+ for field_name , value in data .items ():
1027
+ skip_reasons = [
1028
+ not value ,
1029
+ field_name not in model_fields ,
1030
+ field_name in PURL_FIELDS ,
1031
+ ]
1032
+ if any (skip_reasons ):
1033
+ continue
1034
+
1035
+ current_value = getattr (self , field_name , None )
1036
+ if not current_value or (current_value != value and override ):
1037
+ setattr (self , field_name , value )
1038
+ updated_fields .append (field_name )
1039
+
1040
+ if updated_fields :
1041
+ self .save ()
1042
+
1043
+ return updated_fields
1044
+
1045
+
1009
1046
class RunQuerySet (ProjectRelatedQuerySet ):
1010
1047
def not_started (self ):
1011
1048
"""
@@ -1814,6 +1851,7 @@ class DiscoveredPackage(
1814
1851
ProjectRelatedModel ,
1815
1852
ExtraDataFieldMixin ,
1816
1853
SaveProjectErrorMixin ,
1854
+ UpdateFromDataMixin ,
1817
1855
AbstractPackage ,
1818
1856
):
1819
1857
"""
@@ -1873,15 +1911,11 @@ def purl(self):
1873
1911
"""
1874
1912
return self .package_url
1875
1913
1876
- @classmethod
1877
- def purl_fields (cls ):
1878
- return PackageURL ._fields
1879
-
1880
1914
@classmethod
1881
1915
def extract_purl_data (cls , package_data ):
1882
1916
purl_data = {}
1883
1917
1884
- for field_name in cls . purl_fields () :
1918
+ for field_name in PURL_FIELDS :
1885
1919
value = package_data .get (field_name )
1886
1920
if field_name == "qualifiers" :
1887
1921
value = normalize_qualifiers (value , encode = True )
@@ -1929,33 +1963,6 @@ def create_from_data(cls, project, package_data):
1929
1963
discovered_package .save (save_error = False , capture_exception = False )
1930
1964
return discovered_package
1931
1965
1932
- def update_from_data (self , package_data , override = False ):
1933
- """
1934
- Update this discovered package instance with the provided `package_data`.
1935
- The `save()` is called only if at least one field was modified.
1936
- """
1937
- model_fields = DiscoveredPackage .model_fields ()
1938
- updated_fields = []
1939
-
1940
- for field_name , value in package_data .items ():
1941
- skip_reasons = [
1942
- not value ,
1943
- field_name not in model_fields ,
1944
- field_name in self .purl_fields (),
1945
- ]
1946
- if any (skip_reasons ):
1947
- continue
1948
-
1949
- current_value = getattr (self , field_name , None )
1950
- if not current_value or (current_value != value and override ):
1951
- setattr (self , field_name , value )
1952
- updated_fields .append (field_name )
1953
-
1954
- if updated_fields :
1955
- self .save ()
1956
-
1957
- return updated_fields
1958
-
1959
1966
1960
1967
class DiscoveredDependencyQuerySet (ProjectRelatedQuerySet ):
1961
1968
pass
@@ -2140,15 +2147,15 @@ def create_from_data(
2140
2147
2141
2148
return discovered_dependency
2142
2149
2143
- def update_from_data (self , dependency_data ):
2150
+ def update_from_data (self , data ):
2144
2151
"""
2145
- Update this discovered dependency instance with the provided `dependency_data `.
2152
+ Update this object instance with the provided `data `.
2146
2153
The `save()` is called only if at least one field was modified.
2147
2154
"""
2148
- model_fields = DiscoveredDependency .model_fields ()
2155
+ model_fields = self . __class__ .model_fields ()
2149
2156
updated_fields = []
2150
2157
2151
- for field_name , value in dependency_data .items ():
2158
+ for field_name , value in data .items ():
2152
2159
skip_reasons = [
2153
2160
not value ,
2154
2161
field_name not in model_fields ,
0 commit comments