Skip to content

Commit 73b53cb

Browse files
authored
Merge pull request #292 from beliaev-maksim/beliaev_create_folders
added possibility to create folder tree + example + fix
2 parents 6a6919b + ccb0a3d commit 73b53cb

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from settings import settings
2+
3+
from office365.runtime.auth.user_credential import UserCredential
4+
from office365.sharepoint.client_context import ClientContext
5+
6+
credentials = UserCredential(settings['user_credentials']['username'],
7+
settings['user_credentials']['password'])
8+
ctx = ClientContext(settings['url']).with_credentials(credentials)
9+
10+
# create one folder only
11+
target_folder = "/Shared Documents/test_folder"
12+
target_folder = ctx.web.get_folder_by_server_relative_url(target_folder)
13+
target_folder.add("new_folder")
14+
ctx.execute_query() # have to execute
15+
16+
# create relative folder tree, no execution required
17+
target_folder = "/Shared Documents/test_folder/20201116/1133/test"
18+
target_folder = ctx.web.ensure_folder_path(target_folder)
19+
20+
21+
22+
23+

office365/sharepoint/webs/web.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
13
from office365.runtime.client_result import ClientResult
24
from office365.runtime.client_value_collection import ClientValueCollection
35
from office365.runtime.queries.client_query import ClientQuery
@@ -189,11 +191,33 @@ def get_folder_by_server_relative_url(self, url):
189191
"""Returns the folder object located at the specified server-relative URL.
190192
:type url: str
191193
"""
194+
if url.startswith("/"):
195+
url = url[1:]
196+
192197
return Folder(
193198
self.context,
194199
ResourcePathServiceOperation("getFolderByServerRelativeUrl", [url], self.resource_path)
195200
)
196201

202+
def ensure_folder_path(self, path):
203+
"""
204+
Function to create folder tree
205+
:type path: string
206+
:param path: relative server URL (path) to a folder
207+
"""
208+
209+
url_component = os.path.normpath(path).split(os.path.sep)
210+
url_component = [part for part in url_component if part] # ensure no empty elements
211+
if not url_component:
212+
raise NotADirectoryError("Wrong relative URL provided")
213+
214+
folder = self.get_folder_by_server_relative_url(url_component[0])
215+
for url_part in url_component[1:]:
216+
folder = folder.add(url_part)
217+
218+
self.context.execute_query() # need to execute now, otherwise folders are created in "after_execute_query"
219+
return folder
220+
197221
def ensure_user(self, login_name):
198222
"""Checks whether the specified logon name belongs to a valid user of the website, and if the logon name does
199223
not already exist, adds it to the website.

0 commit comments

Comments
 (0)