Skip to content Skip to sidebar Skip to footer

Office365-rest-python-client 401 On File Update

I finally got over the hurdle of uploading files into SharePoint which enabled me to answer my own question here: Office365-REST-Python-Client Access Token issue However, the whole

Solution 1:

Upload endpoint request

url: http://site url/_api/web/GetFolderByServerRelativeUrl('/Shared Documents')/Files/Add(url='file name', overwrite=true)
method: POST
body: contents of binary file
headers:
    Authorization: "Bearer " + accessToken
    X-RequestDigest: form digest value
    content-type: "application/json;odata=verbose"
    content-length:length of post body

could be converted to the following Python example:

ctx = ClientContext(url, ctx_auth)

file_info = FileCreationInformation()
file_info.content = file_content
file_info.url = os.path.basename(path)
file_info.overwrite = True
target_file = ctx.web.get_folder_by_server_relative_url("Shared Documents").files.add(file_info)
ctx.execute_query()

Once file is uploaded, it's metadata could be set like this:

list_item = target_file.listitem_allfields # get associated list item 
list_item.set_property("Title", "New title")
list_item.update()
ctx.execute_query()

Solution 2:

I'm glad I stumbled upon this post and Office365-REST-Python-Client in general. However, I'm currently stuck trying to update a file's metadata, I keep receiving:

'File' object has no attribute 'listitem_allfields'

Any help is greatly appreciated. Note, I also updated this module to v 2.3.1

Here's my code:

list_title = "Documents"
target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontents)    
ctx.execute_query()
list_item = target_file.listitem_allfields

I've also tried:

library_root = ctx.web.get_folder_by_server_relative_url('Shared Documents')
file_info = FileCreationInformation()
file_info.overwrite = True
file_info.content = filecontent
file_info.url = filename
upload_file = library_root.files.add(file_info)
ctx.load(upload_file)
ctx.execute_query()
list_item = upload_file.listitem_allfields

I've also tried to get the uploaded file item directly with the same result:

target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontent)    
ctx.execute_query()

uploaded_file = ctx.web.get_file_by_server_relative_url(target_file.serverRelativeUrl)
print(uploaded_file.__dict__)
list_item = uploaded_file.listitem_allfields

All variations return:

'File' object has no attribute 'listitem_allfields'

What am I missing? How to add metadata to a new SPO file/list item uploaded via Python/Office365-REST-Python-Client

Update: The problem was I was looking for the wrong property of the uploaded file. The correct attribute is:

uploaded_file.listItemAllFields

Note the correct casing. Hopefully my question/answer may help someone else who's is as ignorant as me of attribute/object casing.


Post a Comment for "Office365-rest-python-client 401 On File Update"