diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index b893f869b73..426dcb492c1 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -798,19 +798,34 @@ class Registry(object): tabular.CSV() ] - def get_converters_by_datatype(self, ext): - """Returns available converters by source type""" + def get_converters_by_datatype(self, ext, priority_formats=None): + """ + Returns available converters by source type. + `priority_formats` will contain a list of format extensions that should + be handled with priority. This means they will end up infront of the + returned ordered dictionary. + """ if ext not in self._converters_by_datatype: converters = odict() + prio_converters = odict() source_datatype = type(self.get_datatype_by_extension(ext)) for ext2, converters_dict in self.datatype_converters.items(): converter_datatype = type(self.get_datatype_by_extension(ext2)) if issubclass(source_datatype, converter_datatype): - converters.update(converters_dict) + for k, v in converters_dict.items(): + if k in priority_formats: + prio_converters[k] = v + else: + converters[k] = v # Ensure ext-level converters are present if ext in self.datatype_converters.keys(): - converters.update(self.datatype_converters[ext]) - self._converters_by_datatype[ext] = converters + for k, v in self.datatype_converters[ext].items(): + if k in priority_formats: + prio_converters[k] = v + else: + converters[k] = v + prio_converters.update(converters) + self._converters_by_datatype[ext] = prio_converters return self._converters_by_datatype[ext] def get_converter_by_target_type(self, source_ext, target_ext): @@ -822,7 +837,10 @@ class Registry(object): def find_conversion_destination_for_dataset_by_extensions(self, dataset, accepted_formats, converter_safe=True): """Returns ( target_ext, existing converted dataset )""" - for convert_ext in self.get_converters_by_datatype(dataset.ext): + + converters = self.get_converters_by_datatype(dataset.ext, [k.file_ext for k in accepted_formats]) + + for convert_ext in converters: convert_ext_datatype = self.get_datatype_by_extension(convert_ext) if convert_ext_datatype is None: self.log.warning("Datatype class not found for extension '%s', which is used as target for conversion from datatype '%s'" % (convert_ext, dataset.ext))