diff --git a/odm_sdk/files_util.py b/odm_sdk/files_util.py index 8782c7d2..7b9a4f0a 100644 --- a/odm_sdk/files_util.py +++ b/odm_sdk/files_util.py @@ -48,6 +48,7 @@ class FilesUtil(Application): ALIGNED_READS = 'com.genestack.bio.files.IAlignedReads' VARIATION_FILE = 'com.genestack.bio.files.IVariationFile' APPLICATION_PAGE_FILE = 'com.genestack.api.files.IApplicationPageFile' + DICTIONARY_FILE = 'com.genestack.api.files.IDictionaryFile' REFERENCE_GENOME = 'com.genestack.bio.files.IReferenceGenome' AUXILIARY_FILE = 'com.genestack.api.files.IAuxiliaryFile' INDEX_FILE = 'com.genestack.api.files.IIndexFile' @@ -366,7 +367,33 @@ def load_info(self, accessions): """ return self.invoke('loadInfo', accessions) - def search_files(self, accession): - return self.invoke('searchFiles', - accession, # type: str - {}, [], 100, 0, None, False) + def search_files(self, search_string, parameters=None, data_types=None, + max_on_page=100, page_num=0, sort_order=None, ascending=False): + """ + Search for files. + + :param search_string: search string (e.g. accession) + :type search_string: str + :param parameters: dictionary of search parameters + :type parameters: dict[str, str] + :param data_types: list of Java class names for file types + :type data_types: list[str] + :param max_on_page: maximum number of results per page + :param page_num: page number + :param sort_order: sort order (see SortOrder class) + :param ascending: sort direction + :return: list of file infos + """ + parameters = parameters or {} + data_types = data_types or [] + + return self.invoke( + 'searchFiles', + search_string, # type: str + parameters, # type: dict + data_types, # type: list + max_on_page, # type: int + page_num, # type: int + sort_order, # type: str + ascending # type: bool + ) diff --git a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py index 36b01174..4a0acdfa 100644 --- a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py +++ b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py @@ -18,8 +18,7 @@ from odm_sdk.scripts.utils import colored, GREEN, BLUE, RED -def load_dictionary(connection, data, parent_dictionary=None, replace=True, - reuse_old_version=False, metainfo=None): +def load_dictionary(connection, data, parent_dictionary=None, replace=False, metainfo=None): if metainfo: metainfo.add_string(Metainfo.DESCRIPTION, data.get('description')) @@ -32,29 +31,32 @@ def load_dictionary(connection, data, parent_dictionary=None, replace=True, term_type = data.get('term_type') fu = FilesUtil(connection) - parent = fu.get_folder( - fu.get_special_folder(SpecialFolders.CREATED), - 'Data samples', - 'Dictionaries', - create=True) - di = DataImporter(connection) - old_dictionary_version = fu.find_file_by_name(name, parent=parent) - if old_dictionary_version: + + search_dictionaries = fu.search_files( + search_string=name, + parameters={'type': FilesUtil.DICTIONARY_FILE, 'name': name, 'obsolete': 'false'}) + if search_dictionaries['count'] > 0: if replace: - print('Old version of dictionary %s / %s is removed' - % (colored(old_dictionary_version, GREEN), colored(name, BLUE))) - fu.mark_obsolete(old_dictionary_version) - fu.unlink_file(old_dictionary_version, parent) + # Mark all existing dictionaries as obsolete + for dictionary_file in search_dictionaries['files']: + accession = dictionary_file['accessions'][0] + fu.mark_obsolete(accession) + print('Old version of dictionary %s / %s is marked as obsolete' + % (colored(accession, GREEN), colored(name, BLUE))) else: - if reuse_old_version: - print('Dictionary %s / %s already exists and will be reused' - % (colored(old_dictionary_version, GREEN), colored(name, BLUE))) - return old_dictionary_version + existing_accessions = [] + for dictionary_file in search_dictionaries['files']: + existing_accessions.extend(dictionary_file['accessions']) raise GenestackException( - "Dictionary %s / %s already exists, set replace=True to replace it" - % (colored(old_dictionary_version, GREEN), colored(name, BLUE))) + "Dictionary %s already exists with accessions: %s. Use --replace flag to overwrite it" + % (colored(name, BLUE), ', '.join([colored(acc, GREEN) for acc in existing_accessions]))) + parent = fu.get_folder( + fu.get_special_folder(SpecialFolders.CREATED), + 'Data samples', + 'Dictionaries', + create=True) accession = di.create_dictionary( parent=parent, name=name, @@ -103,7 +105,7 @@ def main(): connection = get_connection(args) with open(args.file_with_dictionaries, 'r') as data_file: dictionaries = json.load(data_file) - accessions = [load_dictionary(connection, data) for data in dictionaries] + accessions = [load_dictionary(connection, data, replace=args.replace) for data in dictionaries] initialization(connection, accessions) sharing(connection, accessions) @@ -117,6 +119,8 @@ def get_arguments(): group.add_argument('--file_with_dictionaries', metavar='', default="dictionaries.json", help='dictionaries to load', required=True) + parser.add_argument('--replace', action='store_true', default=False, + help='replace existing dictionaries') args = parser.parse_args() return args