Skip to content

Commit cc1f0bf

Browse files
vvgrem@gmail.comvvgrem@gmail.com
authored andcommitted
SharePoint API: PeopleManager, SocialFollowingManager
1 parent 7ffbe92 commit cc1f0bf

File tree

9 files changed

+80
-49
lines changed

9 files changed

+80
-49
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,13 @@ the following clients are available:
113113
#### Authentication
114114

115115
[The Microsoft Authentication Library (MSAL) for Python](https://pypi.org/project/msal/) which comes as a dependency
116-
is used as a default library to obtain token to call Microsoft Graph API. But in terms of Microsoft Graph API
117-
authentication, another Microsoft Authentication Client compliant libraries such [adal](https://github.com/AzureAD/azure-activedirectory-library-for-python)
118-
as are supported as well.
116+
is used as a default library to obtain tokens to call Microsoft Graph API.
117+
118+
Using [Microsoft Authentication Library (MSAL) for Python](https://pypi.org/project/msal/)
119119

120120
> Note: access token is getting acquired via [Client Credential flow](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow)
121121
> in the provided examples
122122
123-
Using [Microsoft Authentication Library (MSAL) for Python](https://pypi.org/project/msal/)
124-
125123
```python
126124
import msal
127125
from office365.graph_client import GraphClient
@@ -144,6 +142,9 @@ client = GraphClient(acquire_token)
144142

145143
```
146144

145+
But in terms of Microsoft Graph API authentication, another Microsoft Authentication Client compliant libraries
146+
such as [adal](https://github.com/AzureAD/azure-activedirectory-library-for-python)
147+
are supported as well.
147148

148149
Using [ADAL Python](https://adal-python.readthedocs.io/en/latest/#)
149150

examples/teams/provision_team.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,3 @@ def print_failure(retry_number):
3838
result = client.teams.create(group_name)
3939
client.execute_query_retry(max_retry=5, failure_callback=print_failure)
4040
print("Team has been provisioned")
41-
42-
channels = result.value.channels
43-
client.load(channels)
44-
client.execute_query()

office365/sharepoint/folders/folder_collection.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ class FolderCollection(ClientObjectCollection):
99
def __init__(self, context, resource_path=None):
1010
super(FolderCollection, self).__init__(context, Folder, resource_path)
1111

12+
def get(self):
13+
"""
14+
:rtype: FolderCollection
15+
"""
16+
return super(FolderCollection, self).get()
17+
1218
def add(self, server_relative_url):
1319
"""Adds the folder that is located at the specified URL to the collection.
1420
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from office365.sharepoint.base_entity import BaseEntity
2+
3+
4+
class SocialFollowingManager(BaseEntity):
5+
"""Provides methods for managing a user's list of followed actors (users, documents, sites, and tags)."""
Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
1+
from office365.runtime.client_result import ClientResult
2+
from office365.runtime.queries.service_operation_query import ServiceOperationQuery
3+
from office365.runtime.resource_path import ResourcePath
14
from office365.sharepoint.base_entity import BaseEntity
5+
from office365.sharepoint.userprofiles.personalSiteCreationPriority import PersonalSiteCreationPriority
26

37

48
class PeopleManager(BaseEntity):
59
"""Provides methods for operations related to people."""
6-
pass
10+
11+
def __init__(self, context):
12+
super().__init__(context, ResourcePath("SP.UserProfiles.PeopleManager"))
13+
14+
def get_user_profile_properties(self, accountName):
15+
"""
16+
:type accountName: str
17+
:return: dict
18+
"""
19+
result = ClientResult(None)
20+
payload = {"accountName": accountName}
21+
qry = ServiceOperationQuery(self, "GetUserProfileProperties", payload, None, None, result)
22+
self.context.add_query(qry)
23+
return result
24+
25+
def get_default_document_library(self, accountName, createSiteIfNotExists=False,
26+
siteCreationPriority=PersonalSiteCreationPriority.Low):
27+
result = ClientResult(str)
28+
params = {"accountName": accountName,
29+
"createSiteIfNotExists": createSiteIfNotExists,
30+
"siteCreationPriority": siteCreationPriority}
31+
qry = ServiceOperationQuery(self, "GetDefaultDocumentLibrary", params, None, None, result)
32+
self.context.add_query(qry)
33+
return result
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class PersonalSiteCreationPriority:
2+
Low = 0
3+
Medium = 1
4+
High = 2

requirements.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
requests~=2.24.0
22
requests_ntlm [NTLMAuthentication]
3-
setuptools~=50.3.0
3+
setuptools~=50.3.2
44

5-
adal~=1.2.4
65
msal~=1.5.0
7-
Faker~=4.1.2
86
astunparse~=1.6.3

tests/sharepoint/test_folder.py

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,54 +29,41 @@ def setUpClass(cls):
2929

3030
@classmethod
3131
def tearDownClass(cls):
32-
cls.target_list.delete_object()
33-
cls.client.execute_query()
32+
cls.target_list.delete_object().execute_query()
3433

3534
def test1_enum_folders_and_files(self):
36-
parent_folder = self.__class__.target_list.rootFolder
37-
self.client.load(parent_folder)
38-
self.client.execute_query()
35+
parent_folder = self.__class__.target_list.rootFolder.get().execute_query()
3936
self.assertIsNotNone(parent_folder.serverRelativeUrl)
4037

4138
folder_url = parent_folder.serverRelativeUrl
42-
folder_object = self.client.web.get_folder_by_server_relative_url(folder_url)
43-
self.client.load(folder_object)
44-
self.client.execute_query()
39+
folder_object = self.client.web.get_folder_by_server_relative_url(folder_url).get().execute_query()
4540
self.assertTrue(folder_object.properties["ServerRelativeUrl"], folder_url)
46-
folders = folder_object.folders
47-
self.client.load(folders)
48-
self.client.execute_query()
41+
folders = folder_object.folders.get().execute_query()
4942
for child_folder in folders:
5043
self.assertIsNotNone(child_folder.resource_path)
51-
self.assertIsNotNone(child_folder.resource_path)
52-
files = child_folder.files
53-
self.client.load(files)
54-
self.client.execute_query()
44+
files = child_folder.files.get().execute_query()
5545
for file_in_folder in files:
5646
self.assertIsNotNone(file_in_folder.resource_path)
5747

5848
def test2_create_folder(self):
59-
folder_new = self.__class__.target_list.rootFolder.folders.add(self.__class__.target_folder_name)
60-
self.client.execute_query()
49+
folder_new = self.__class__.target_list.rootFolder.folders.add(self.__class__.target_folder_name).execute_query()
6150
self.assertTrue(folder_new.properties["Exists"])
6251
self.__class__.target_folder = folder_new
6352

6453
def test3_get_folder_by_id(self):
6554
folder_id = self.__class__.target_folder.properties['UniqueId']
66-
folder = self.client.web.get_folder_by_id(folder_id)
67-
self.client.execute_query()
55+
folder = self.client.web.get_folder_by_id(folder_id).execute_query()
6856
self.assertIsNotNone(folder.resource_path)
6957

7058
def test4_update_folder(self):
7159
folder_to_update = self.__class__.target_list.rootFolder.folders.get_by_url(self.__class__.target_folder_name)
7260
self.__class__.target_folder_name = "_Archive_" + str(randint(0, 1000))
73-
folder_to_update.rename(self.__class__.target_folder_name)
74-
self.client.execute_query()
61+
folder_to_update.rename(self.__class__.target_folder_name).execute_query()
7562

76-
result = self.__class__.target_list.rootFolder.folders.filter(
77-
"Name eq '{0}'".format(self.__class__.target_folder_name))
78-
self.client.load(result)
79-
self.client.execute_query()
63+
result = self.__class__.target_list.rootFolder.folders\
64+
.filter("Name eq '{0}'".format(self.__class__.target_folder_name))\
65+
.get()\
66+
.execute_query()
8067
self.assertEqual(len(result), 1)
8168

8269
def test5_copy_folder(self):
@@ -132,8 +119,8 @@ def test_11_delete_folder(self):
132119
folder_to_delete = self.__class__.target_list.rootFolder.folders.get_by_url(self.__class__.target_folder_name)
133120
folder_to_delete.delete_object().execute_query()
134121

135-
result = self.__class__.target_list.rootFolder.folders.filter(
136-
"Name eq '{0}'".format(self.__class__.target_folder_name))
137-
self.client.load(result)
138-
self.client.execute_query()
122+
result = self.__class__.target_list.rootFolder.folders\
123+
.filter("Name eq '{0}'".format(self.__class__.target_folder_name))\
124+
.get()\
125+
.execute_query()
139126
self.assertEqual(len(result), 0)

tests/sharepoint/test_user_profile.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from office365.runtime.auth.user_credential import UserCredential
44
from office365.sharepoint.client_context import ClientContext
5-
from office365.sharepoint.userprofiles.userProfilePropertiesForUser import UserProfilePropertiesForUser
5+
from office365.sharepoint.userprofiles.peopleManager import PeopleManager
66
from settings import settings
77

88

@@ -31,9 +31,16 @@ def test3_create_personal_site(self):
3131
up = user_profile.create_personal_site_enque(True).execute_query()
3232
self.assertIsNotNone(up.properties['PublicUrl'])
3333

34-
# def test4_get_user_props(self):
35-
# account_name = settings['user_credentials']['username']
36-
# props = UserProfilePropertiesForUser(self.my_client, account_name, ['PublicUrl'])
37-
# self.my_client.load(props)
38-
# self.my_client.execute_query()
39-
# self.assertIsNotNone(props)
34+
def test4_get_user_props(self):
35+
me = self.my_client.web.currentUser.get().execute_query()
36+
people_manager = PeopleManager(self.my_client)
37+
result = people_manager.get_user_profile_properties(me.login_name)
38+
self.my_client.execute_query()
39+
self.assertIsNotNone(result.value)
40+
41+
def test5_get_default_document_library(self):
42+
me = self.my_client.web.currentUser.get().execute_query()
43+
people_manager = PeopleManager(self.my_client)
44+
result = people_manager.get_default_document_library(me.login_name)
45+
self.my_client.execute_query()
46+
self.assertIsNotNone(result.value)

0 commit comments

Comments
 (0)