I am attempting to move ContentVersion records from one Salesforce org to another using the simple-salesforce python library.
I am querying the VersionData and returning it in r.content here:
import json
import requests
import base64
import chardet
headers = {
"Authorization": "OAuth " + source_sf.session_id,
"Content-Type": "application/octet-stream"
}
for index, row in content_doc_source_data_df.iterrows():
r = requests.request('get', source_sf.base_url+'sobjects/ContentVersion/'+row['Id']+'/VersionData', headers=headers)
content_doc_source_data_df.at[index, 'File Body'] = r.content
break
content_doc_source_data_df.drop('Id', axis=1, inplace=True)
content_doc_source_data_df.drop('ContentDocumentId', axis=1, inplace=True)
content_doc_source_data_df.drop('ContentLocation', axis=1, inplace=True)
content_doc_source_data_df.drop('ContentUrl', axis=1, inplace=True)
content_doc_source_data_df.drop('IsLatest', axis=1, inplace=True)
content_doc_source_data_df.drop('VersionData', axis=1, inplace=True)
content_doc_source_data_df = content_doc_source_data_df.rename(columns={'File Body': 'VersionData'})
display(content_doc_source_data_df)
Which I can tell is returning the bites data, which you can see here:
However, whenever I then attempt to resend it to the new org using the API I get the following error: "TypeError: Object of type bytes is not JSON serializable"
Here's the code for sending:
#INSERT FILE
import ast
content_doc_source_data = content_doc_source_data_df.to_dict('records')
results = source_sf.bulk.ContentVersion.insert(content_doc_source_data, batch_size=10000,use_serial=True)
display(results)