Skip to content

Commit 29f2349

Browse files
committed
Folder.get_folders() method, typings improvements for SharePoint API
1 parent c07cc19 commit 29f2349

File tree

30 files changed

+274
-210
lines changed

30 files changed

+274
-210
lines changed

examples/onedrive/drives/list.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
from tests.graph_case import acquire_token_by_client_credentials
88

99
client = GraphClient(acquire_token_by_client_credentials)
10-
drives = client.drives.get().top(10).execute_query()
10+
drives = client.drives.get().top(100).execute_query()
1111
for drive in drives:
1212
print("Drive url: {0}".format(drive.web_url))

examples/sharepoint/files/permissions/assign.py

+5-11
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,10 @@
1212
client = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
1313
file_url = "Shared Documents/report #123.csv"
1414

15-
# Step 1: retrieve objects
16-
role_def = client.web.role_definitions.get_by_type(
17-
RoleType.Contributor
18-
) # address role by type
19-
user = client.web.site_users.get_by_email(
20-
test_user_principal_name_alt
21-
) # address user by email
22-
target_file = client.web.get_file_by_server_relative_path(
23-
file_url
24-
) # address file by relative url
2515

26-
# Step 2: to assign a custom permissions to a file
16+
role_def = client.web.role_definitions.get_by_type(RoleType.Contributor)
17+
user = client.web.site_users.get_by_principal_name(test_user_principal_name_alt)
18+
target_file = client.web.get_file_by_server_relative_path(file_url)
19+
20+
# assign a custom permissions for the user to a file
2721
target_file.listItemAllFields.add_role_assignment(user, role_def).execute_query()

examples/sharepoint/folders/get_props.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Get Folder properties
2+
Gets Folder properties
33
"""
44
from office365.sharepoint.client_context import ClientContext
55
from tests import test_client_credentials, test_team_site_url
+10-20
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
1-
from typing import Callable
1+
"""
2+
Demonstrates how to enumerate a folder
3+
"""
24

35
from office365.sharepoint.client_context import ClientContext
4-
from office365.sharepoint.folders.folder import Folder
56
from tests import test_client_credentials, test_team_site_url
67

78
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
8-
9-
10-
def enum_folder(parent_folder, action):
11-
# type: (Folder, Callable[[Folder], None]) -> None
12-
parent_folder.expand(["Folders"]).get().execute_query()
13-
action(parent_folder)
14-
for folder in parent_folder.folders:
15-
enum_folder(folder, action)
16-
17-
18-
def print_folder_stat(folder):
19-
# type: (Folder) -> None
20-
print(folder.serverRelativeUrl)
21-
print(folder.time_created)
22-
23-
24-
root_folder = ctx.web.default_document_library().root_folder
25-
enum_folder(root_folder, print_folder_stat)
9+
folders = (
10+
ctx.web.default_document_library().root_folder.get_folders(True).execute_query()
11+
)
12+
for folder in folders:
13+
print(
14+
"Url: {0}, Created: {1}".format(folder.serverRelativeUrl, folder.time_created)
15+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
Demonstrates how to enumerate a folder
3+
"""
4+
from typing import Callable
5+
6+
from office365.sharepoint.client_context import ClientContext
7+
from office365.sharepoint.folders.folder import Folder
8+
from tests import test_client_credentials, test_team_site_url
9+
10+
11+
def enum_folder(parent_folder, action):
12+
# type: (Folder, Callable[[Folder], None]) -> None
13+
parent_folder.expand(["Folders"]).get().execute_query()
14+
action(parent_folder)
15+
for folder in parent_folder.folders:
16+
enum_folder(folder, action)
17+
18+
19+
def print_folder_stat(folder):
20+
# type: (Folder) -> None
21+
print(folder.serverRelativeUrl)
22+
print(folder.time_created)
23+
24+
25+
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
26+
root_folder = ctx.web.default_document_library().root_folder
27+
enum_folder(root_folder, print_folder_stat)

examples/sharepoint/groups/add_remove_user.py examples/sharepoint/groups/add_remove.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""
22
Adds and removes site group
3-
43
"""
54
from office365.sharepoint.client_context import ClientContext
65
from tests import create_unique_name, test_password, test_site_url, test_username
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""
2+
Expands group to a collection of principals.
3+
"""
4+
from office365.sharepoint.client_context import ClientContext
5+
from tests import test_client_id, test_client_secret, test_team_site_url
6+
7+
ctx = ClientContext(test_team_site_url).with_client_credentials(
8+
test_client_id, test_client_secret
9+
)
10+
11+
result = ctx.web.associated_member_group.expand_to_principals(100).execute_query()
12+
for principal_info in result.value:
13+
print(principal_info)
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
"""
2-
Export the top navigation
2+
Prints the top navigation
33
"""
4-
import json
54

65
from office365.sharepoint.client_context import ClientContext
76
from tests import test_client_credentials, test_team_site_url
87

98
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
109
nav = ctx.web.navigation.top_navigation_bar.get().execute_query()
11-
print(json.dumps(nav.to_json(), indent=4))
10+
for item in nav:
11+
print(item)
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""
2-
Returns the user permissions for the list.
2+
Returns the user permissions for the list/lib.
33
"""
44
from office365.sharepoint.client_context import ClientContext
55
from tests import test_client_credentials, test_team_site_url
66

77
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
88
doc_lib = ctx.web.default_document_library()
99
result = doc_lib.get_user_effective_permissions(ctx.web.current_user).execute_query()
10-
print(result.value.permission_levels)
10+
for perm_level in result.value:
11+
print(perm_level)
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
"""
2-
Demonstrates how to retrieve site groups along with users
2+
Returns the user permissions for the site
33
"""
4+
from pprint import pprint
5+
46
from office365.sharepoint.client_context import ClientContext
57
from tests import test_client_credentials, test_team_site_url
68

79
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
8-
9-
site_groups = ctx.web.site_groups.expand(["Users"]).get().execute_query()
10-
for g in site_groups:
11-
print("Group name: {0}".format(g.login_name))
12-
for u in g.users:
13-
print("User name: {0}".format(u.login_name))
10+
result = ctx.web.get_user_effective_permissions(ctx.web.current_user).execute_query()
11+
pprint(result.value.permission_levels)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
Grants user access to web
3+
"""
4+
from office365.sharepoint.client_context import ClientContext
5+
from office365.sharepoint.sharing.role_type import RoleType
6+
from tests import (
7+
test_client_credentials,
8+
test_team_site_url,
9+
test_user_principal_name_alt,
10+
)
11+
12+
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
13+
result = ctx.web.add_role_assignment(
14+
test_user_principal_name_alt, RoleType.Contributor
15+
).execute_query()
16+
print("Access has been granted")
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""
2+
Demonstrates how to retrieve site groups along with users
3+
"""
4+
from office365.sharepoint.client_context import ClientContext
5+
from tests import test_client_credentials, test_team_site_url
6+
7+
ctx = ClientContext(test_team_site_url).with_credentials(test_client_credentials)
8+
site_groups = ctx.web.site_groups.expand(["Users"]).get().execute_query()
9+
for g in site_groups:
10+
print("Group: {0}".format(g.login_name))
11+
for u in g.users:
12+
print("User: {0}".format(u.login_name))

examples/sharepoint/webs/get_lists.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
"""
2+
Enumerate across all lists in a site
3+
"""
4+
15
from office365.sharepoint.client_context import ClientContext
26
from tests import test_client_credentials, test_site_url
37

48
client = ClientContext(test_site_url).with_credentials(test_client_credentials)
5-
lists = client.web.get_lists().execute_query()
9+
# lists = client.web.get_lists().execute_query()
10+
lists = client.web.lists.get_all().execute_query()
611
for lst in lists:
712
print(lst.title)

office365/runtime/odata/type.py

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import datetime
2+
import inspect
23
import uuid
4+
from typing import Type
35

46

57
class ODataType(object):
@@ -93,6 +95,16 @@ def resolve_type(client_type):
9395
else:
9496
return ODataType.primitive_types.get(client_type, None)
9597

98+
@staticmethod
99+
def resolve_enum_key(enum_type, value):
100+
# type: (Type, int) -> str
101+
return next(
102+
iter(
103+
[item[0] for item in inspect.getmembers(enum_type) if item[1] == value]
104+
),
105+
None,
106+
)
107+
96108
def add_property(self, prop_schema):
97109
"""
98110
:type prop_schema: office365.runtime.odata.property.ODataProperty

office365/sharepoint/changes/change.py

+2-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import datetime
2-
import inspect
32
from typing import Optional
43

4+
from office365.runtime.odata.type import ODataType
55
from office365.sharepoint.changes.token import ChangeToken
66
from office365.sharepoint.changes.type import ChangeType
77
from office365.sharepoint.entity import Entity
@@ -12,16 +12,7 @@ class Change(Entity):
1212

1313
@property
1414
def change_type_name(self):
15-
return next(
16-
iter(
17-
[
18-
item[0]
19-
for item in inspect.getmembers(ChangeType)
20-
if item[1] == self.change_type
21-
]
22-
),
23-
None,
24-
)
15+
return ODataType.resolve_enum_key(ChangeType, self.change_type)
2516

2617
@property
2718
def change_token(self):

office365/sharepoint/fields/related_field_collection.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from office365.sharepoint.fields.related_field import RelatedField
44

55

6-
class RelatedFieldCollection(EntityCollection):
6+
class RelatedFieldCollection(EntityCollection[RelatedField]):
77
"""Represents a collection of RelatedField resources."""
88

99
def __init__(self, context, resource_path=None):

office365/sharepoint/folders/folder.py

+19
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,25 @@ def download_folder(
5454
self, download_file, after_file_downloaded, recursive
5555
)
5656

57+
def get_folders(self, recursive=False):
58+
"""
59+
Retrieves folders
60+
:param bool recursive: Determines whether to enumerate folders recursively
61+
"""
62+
from office365.sharepoint.folders.collection import FolderCollection # noqa
63+
64+
return_type = FolderCollection(self.context, self.folders.resource_path, self)
65+
66+
def _loaded(parent):
67+
# type: ("Folder") -> None
68+
[return_type.add_child(f) for f in parent.folders]
69+
if recursive:
70+
for folder in parent.folders:
71+
folder.ensure_properties(["Folders"], _loaded, parent=folder)
72+
73+
self.ensure_properties(["Folders"], _loaded, parent=self)
74+
return return_type
75+
5776
def get_files(self, recursive=False):
5877
"""
5978
Retrieves files

office365/sharepoint/forms/collection.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from office365.sharepoint.forms.form import Form
44

55

6-
class FormCollection(EntityCollection):
6+
class FormCollection(EntityCollection[Form]):
77
def __init__(self, context, resource_path=None):
88
"""Specifies a collection of list forms for a list."""
99
super(FormCollection, self).__init__(context, Form, resource_path)

0 commit comments

Comments
 (0)