Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -142,5 +142,3 @@ dmypy.json

#Other
.DS_Store

playwright/.auth
3 changes: 2 additions & 1 deletion figshare/Article.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
16 changes: 9 additions & 7 deletions figshare/Collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down
11 changes: 6 additions & 5 deletions figshare/Utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading