@@ -1899,7 +1899,10 @@ def single_to_json(value):
1899
1899
src = "hda"
1900
1900
if src is not None :
1901
1901
object_id = cached_id (value )
1902
- return {"id" : app .security .encode_id (object_id ) if use_security else object_id , "src" : src }
1902
+ new_val = getattr (value , "extra_params" , {})
1903
+ new_val ["id" ] = app .security .encode_id (object_id ) if use_security else object_id
1904
+ new_val ["src" ] = src
1905
+ return new_val
1903
1906
1904
1907
if value not in [None , "" , "None" ]:
1905
1908
if isinstance (value , list ) and len (value ) > 0 :
@@ -1912,15 +1915,9 @@ def single_to_json(value):
1912
1915
def to_python (self , value , app ):
1913
1916
def single_to_python (value ):
1914
1917
if isinstance (value , dict ) and "src" in value :
1915
- id = value ["id" ] if isinstance (value ["id" ], int ) else app .security .decode_id (value ["id" ])
1916
- if value ["src" ] == "dce" :
1917
- return app .model .context .query (DatasetCollectionElement ).get (id )
1918
- elif value ["src" ] == "hdca" :
1919
- return app .model .context .query (HistoryDatasetCollectionAssociation ).get (id )
1920
- elif value ["src" ] == "ldda" :
1921
- return app .model .context .query (LibraryDatasetDatasetAssociation ).get (id )
1922
- else :
1923
- return app .model .context .query (HistoryDatasetAssociation ).get (id )
1918
+ if not value ["src" ] in ("hda" , "dce" , "ldda" , "hdca" ):
1919
+ raise ParameterValueError (f"Invalid value { value } " , self .name )
1920
+ return src_id_to_item (sa_session = app .model .context , security = app .security , value = value )
1924
1921
1925
1922
if isinstance (value , dict ) and "values" in value :
1926
1923
if hasattr (self , "multiple" ) and self .multiple is True :
@@ -1996,6 +1993,23 @@ def do_validate(v):
1996
1993
raise ValueError ("At most %d datasets are required for %s" % (self .max , self .name ))
1997
1994
1998
1995
1996
+ def src_id_to_item (sa_session , value , security ):
1997
+ src_to_class = {
1998
+ "hda" : HistoryDatasetAssociation ,
1999
+ "ldda" : LibraryDatasetDatasetAssociation ,
2000
+ "dce" : DatasetCollectionElement ,
2001
+ "hdca" : HistoryDatasetCollectionAssociation ,
2002
+ }
2003
+ id_value = value ["id" ]
2004
+ decoded_id = id_value if isinstance (id_value , int ) else security .decode_id (id_value )
2005
+ try :
2006
+ item = sa_session .query (src_to_class [value ["src" ]]).get (decoded_id )
2007
+ except KeyError :
2008
+ raise ValueError (f"Unknown input source { value ['src' ]} passed to job submission API." )
2009
+ item .extra_params = {k : v for k , v in value .items () if k not in ("src" , "id" )}
2010
+ return item
2011
+
2012
+
1999
2013
class DataToolParameter (BaseDataToolParameter ):
2000
2014
# TODO, Nate: Make sure the following unit tests appropriately test the dataset security
2001
2015
# components. Add as many additional tests as necessary.
@@ -2063,21 +2077,13 @@ def from_json(self, value, trans, other_values=None):
2063
2077
value = [int (value_part ) for value_part in value .split ("," )]
2064
2078
rval = []
2065
2079
if isinstance (value , list ):
2066
- found_hdca = False
2080
+ found_srcs = set ()
2067
2081
for single_value in value :
2068
2082
if isinstance (single_value , dict ) and "src" in single_value and "id" in single_value :
2069
- if single_value ["src" ] == "hda" :
2070
- decoded_id = trans .security .decode_id (single_value ["id" ])
2071
- rval .append (trans .sa_session .query (HistoryDatasetAssociation ).get (decoded_id ))
2072
- elif single_value ["src" ] == "hdca" :
2073
- found_hdca = True
2074
- decoded_id = trans .security .decode_id (single_value ["id" ])
2075
- rval .append (trans .sa_session .query (HistoryDatasetCollectionAssociation ).get (decoded_id ))
2076
- elif single_value ["src" ] == "ldda" :
2077
- decoded_id = trans .security .decode_id (single_value ["id" ])
2078
- rval .append (trans .sa_session .query (LibraryDatasetDatasetAssociation ).get (decoded_id ))
2079
- else :
2080
- raise ValueError (f"Unknown input source { single_value ['src' ]} passed to job submission API." )
2083
+ found_srcs .add (single_value ["src" ])
2084
+ rval .append (
2085
+ src_id_to_item (sa_session = trans .sa_session , value = single_value , security = trans .security )
2086
+ )
2081
2087
elif isinstance (
2082
2088
single_value ,
2083
2089
(
@@ -2095,24 +2101,15 @@ def from_json(self, value, trans, other_values=None):
2095
2101
log .warning ("Encoded ID where unencoded ID expected." )
2096
2102
single_value = trans .security .decode_id (single_value )
2097
2103
rval .append (trans .sa_session .query (HistoryDatasetAssociation ).get (single_value ))
2098
- if found_hdca :
2099
- for val in rval :
2100
- if not isinstance (val , HistoryDatasetCollectionAssociation ):
2101
- raise ParameterValueError (
2102
- "if collections are supplied to multiple data input parameter, only collections may be used" ,
2103
- self .name ,
2104
- )
2104
+ if len (found_srcs ) > 1 and "hdca" in found_srcs :
2105
+ raise ParameterValueError (
2106
+ "if collections are supplied to multiple data input parameter, only collections may be used" ,
2107
+ self .name ,
2108
+ )
2105
2109
elif isinstance (value , (HistoryDatasetAssociation , LibraryDatasetDatasetAssociation )):
2106
2110
rval .append (value )
2107
2111
elif isinstance (value , dict ) and "src" in value and "id" in value :
2108
- if value ["src" ] == "hda" :
2109
- decoded_id = trans .security .decode_id (value ["id" ])
2110
- rval .append (trans .sa_session .query (HistoryDatasetAssociation ).get (decoded_id ))
2111
- elif value ["src" ] == "hdca" :
2112
- decoded_id = trans .security .decode_id (value ["id" ])
2113
- rval .append (trans .sa_session .query (HistoryDatasetCollectionAssociation ).get (decoded_id ))
2114
- else :
2115
- raise ValueError (f"Unknown input source { value ['src' ]} passed to job submission API." )
2112
+ rval .append (src_id_to_item (sa_session = trans .sa_session , value = value , security = trans .security ))
2116
2113
elif str (value ).startswith ("__collection_reduce__|" ):
2117
2114
encoded_ids = [v [len ("__collection_reduce__|" ) :] for v in str (value ).split ("," )]
2118
2115
decoded_ids = map (trans .security .decode_id , encoded_ids )
0 commit comments