diff --git a/.gitignore b/.gitignore index b799a68..8b6f0c9 100644 --- a/.gitignore +++ b/.gitignore @@ -142,5 +142,3 @@ dmypy.json #Other .DS_Store - -playwright/.auth diff --git a/figshare/Article.py b/figshare/Article.py index b2407df..e7bb33a 100644 --- a/figshare/Article.py +++ b/figshare/Article.py @@ -305,7 +305,8 @@ def __get_article_metadata_by_version(self, version, article_id): files = version_data['files'] version_md5 = '' - version_data_for_hashing = metadata_to_hash(version_data) + fields_for_hashing = ['description', 'funding_list', 'related_materials'] + version_data_for_hashing = metadata_to_hash(version_data, fields_for_hashing) version_data_for_hashing = standardize_api_result(version_data_for_hashing) version_data_for_hashing = sorter_api_result(version_data_for_hashing) str_version_data_for_hashing = stringify_metadata(version_data_for_hashing).encode("utf-8") diff --git a/figshare/Collection.py b/figshare/Collection.py index b1d0995..fc4dc44 100644 --- a/figshare/Collection.py +++ b/figshare/Collection.py @@ -6,8 +6,8 @@ from datetime import datetime from figshare.Article import Article from figshare.Integration import Integration -from figshare.Utils import standardize_api_result, sorter_api_result, get_preserved_version_hash_and_size, format_version -from figshare.Utils import compare_hash, check_wasabi, check_local_path, get_folder_name_in_local_storage, upload_to_remote +from figshare.Utils import standardize_api_result, sorter_api_result, get_preserved_version_hash_and_size, format_version, metadata_to_hash +from figshare.Utils import compare_hash, check_wasabi, check_local_path, get_folder_name_in_local_storage, upload_to_remote, stringify_metadata class Collection: @@ -260,10 +260,12 @@ def process_collections(self, collections): for version in versions: folder_name = None dict_data = version - dict_data = standardize_api_result(dict_data) - dict_data = sorter_api_result(dict_data) - json_data = json.dumps(dict_data).encode("utf-8") - version_md5 = hashlib.md5(json_data).hexdigest() + fields_for_hashing = ['description', 'funding_list', 'related_materials', 'version'] + dict_data_for_hashing = metadata_to_hash(dict_data, fields_for_hashing) + dict_data_for_hashing = standardize_api_result(dict_data_for_hashing) + dict_data_for_hashing = sorter_api_result(dict_data_for_hashing) + str_dict_data_for_hashing = stringify_metadata(dict_data_for_hashing).encode("utf-8") + version_md5 = hashlib.md5(str_dict_data_for_hashing).hexdigest() version_no = format_version(version['version']) # Checking archival staging storage (local) for existence of package @@ -341,7 +343,7 @@ def process_collections(self, collections): self.system_config['ingest_staging_storage']) if len(version_staging_local_storage_list) > 1: self.logs.write_log_in_file("warning", - f"Multiple copies of article {version['id']} version {version['version']} " + f"Multiple copies of collection {version['id']} version {version['version']} " + "found in archival staging storage", True) if compare_hash(version_md5, version_staging_local_storage_list): diff --git a/figshare/Utils.py b/figshare/Utils.py index e59b956..c2dad8b 100644 --- a/figshare/Utils.py +++ b/figshare/Utils.py @@ -610,21 +610,22 @@ def get_article_id_and_version_from_path(path: str) -> tuple: return article_id, version_no -def metadata_to_hash(metadata: dict) -> dict: +def metadata_to_hash(metadata: dict, hashing_metadata: list) -> dict: """ Reduces an article metadata to specific metadata fields :param metadata: Complete article metadata :type: dict + :param hashing_metadata: metadata fields to keep and perform hashing on + :type: list + :return: A dictionary containing only metadata fields for hash calculation :rtype: dict """ article_metadata = dict(metadata) - full_metadata = list(article_metadata.keys()) - focus_metadata = ['description', 'funding_list', 'related_materials'] - for key in full_metadata: - if key not in focus_metadata: + for key in list(article_metadata.keys()): + if key not in hashing_metadata: del article_metadata[key] return article_metadata