From 416a425fd8984eb333bfbaee76e81941b575f6c7 Mon Sep 17 00:00:00 2001 From: natalyatodorova Date: Mon, 26 Jan 2026 18:06:47 +0000 Subject: [PATCH 1/4] ODM-12453: fix existing dictionary search --- odm_sdk/files_util.py | 35 ++++++++++++++++--- .../load_init_share_dictionaries.py | 10 +++--- 2 files changed, 37 insertions(+), 8 deletions(-) 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..1d9e8eaa 100644 --- a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py +++ b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py @@ -39,13 +39,15 @@ def load_dictionary(connection, data, parent_dictionary=None, replace=True, 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: + old_dictionary_version = search_dictionaries['files'][0]['accessions'][0] if replace: + fu.mark_obsolete(old_dictionary_version) 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) else: if reuse_old_version: print('Dictionary %s / %s already exists and will be reused' From 679a19409f521b5a002f08f8ed873c1b429d22d9 Mon Sep 17 00:00:00 2001 From: natalyatodorova Date: Tue, 27 Jan 2026 15:39:03 +0000 Subject: [PATCH 2/4] !!ODM-12453: add replace flag to args --- .../dictionaries/load_init_share_dictionaries.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py index 1d9e8eaa..89c03b60 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')) @@ -46,15 +45,11 @@ def load_dictionary(connection, data, parent_dictionary=None, replace=True, old_dictionary_version = search_dictionaries['files'][0]['accessions'][0] if replace: fu.mark_obsolete(old_dictionary_version) - print('Old version of dictionary %s / %s is removed' + print('Old version of dictionary %s / %s is marked as obsolete' % (colored(old_dictionary_version, 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 raise GenestackException( - "Dictionary %s / %s already exists, set replace=True to replace it" + "Dictionary %s / %s already exists, use --replace flag to overwrite it" % (colored(old_dictionary_version, GREEN), colored(name, BLUE))) accession = di.create_dictionary( @@ -105,7 +100,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) @@ -119,6 +114,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 From 9f56365774226e0100a80c0990b7da34c3ff0aa3 Mon Sep 17 00:00:00 2001 From: natalyatodorova Date: Tue, 27 Jan 2026 16:12:22 +0000 Subject: [PATCH 3/4] ODM-12453: pass strings as params --- odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py index 89c03b60..8e015817 100644 --- a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py +++ b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py @@ -40,7 +40,7 @@ def load_dictionary(connection, data, parent_dictionary=None, replace=False, met di = DataImporter(connection) search_dictionaries = fu.search_files( search_string=name, - parameters={'type': FilesUtil.DICTIONARY_FILE, 'name': name, 'obsolete': False}) + parameters={'type': FilesUtil.DICTIONARY_FILE, 'name': name, 'obsolete': 'false'}) if search_dictionaries['count'] > 0: old_dictionary_version = search_dictionaries['files'][0]['accessions'][0] if replace: From 0d93559fa48f110ea970a4625bf4984f219625b2 Mon Sep 17 00:00:00 2001 From: natalyatodorova Date: Wed, 28 Jan 2026 11:00:12 +0000 Subject: [PATCH 4/4] ODM-12453: clean all existing dictionaries on replace option --- .../load_init_share_dictionaries.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py index 8e015817..4a0acdfa 100644 --- a/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py +++ b/odm_sdk/scripts/dictionaries/load_init_share_dictionaries.py @@ -31,27 +31,32 @@ def load_dictionary(connection, data, parent_dictionary=None, replace=False, met 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) + search_dictionaries = fu.search_files( search_string=name, parameters={'type': FilesUtil.DICTIONARY_FILE, 'name': name, 'obsolete': 'false'}) if search_dictionaries['count'] > 0: - old_dictionary_version = search_dictionaries['files'][0]['accessions'][0] if replace: - fu.mark_obsolete(old_dictionary_version) - print('Old version of dictionary %s / %s is marked as obsolete' - % (colored(old_dictionary_version, GREEN), colored(name, BLUE))) + # 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: + existing_accessions = [] + for dictionary_file in search_dictionaries['files']: + existing_accessions.extend(dictionary_file['accessions']) raise GenestackException( - "Dictionary %s / %s already exists, use --replace flag to overwrite 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,