Skip to content

Commit ec458ee

Browse files
authored
Add five admin API supports to Web API clients (#1349)
- admin.roles.addAssignments - admin.roles.listAssignments - admin.roles.removeAssignments - admin.conversations.convertToPublic - admin.conversations.lookup
1 parent 4b200f1 commit ec458ee

File tree

6 files changed

+407
-2
lines changed

6 files changed

+407
-2
lines changed

integration_tests/web/test_admin_conversations.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ def test_sync(self):
4747
self.assertIsNotNone(conv_creation)
4848
created_channel_id = conv_creation.data["channel_id"]
4949

50+
self.assertIsNotNone(client.admin_conversations_lookup(last_message_activity_before=100, team_ids=[self.team_id]))
51+
5052
self.assertIsNotNone(
5153
client.admin_conversations_invite(
5254
channel_id=created_channel_id,
@@ -108,6 +110,12 @@ def test_sync(self):
108110
)
109111
)
110112
time.sleep(2) # To avoid internal_error
113+
self.assertIsNotNone(
114+
client.admin_conversations_convertToPublic(
115+
channel_id=created_channel_id,
116+
)
117+
)
118+
time.sleep(2) # To avoid internal_error
111119
self.assertIsNotNone(
112120
client.admin_conversations_archive(
113121
channel_id=created_channel_id,
@@ -134,6 +142,10 @@ async def test_async(self):
134142
self.assertIsNotNone(conv_creation)
135143
created_channel_id = conv_creation.data["channel_id"]
136144

145+
self.assertIsNotNone(
146+
await client.admin_conversations_lookup(last_message_activity_before=100, team_ids=[self.team_id])
147+
)
148+
137149
self.assertIsNotNone(
138150
await client.admin_conversations_invite(
139151
channel_id=created_channel_id,
@@ -189,6 +201,12 @@ async def test_async(self):
189201
)
190202
)
191203
await asyncio.sleep(2) # To avoid internal_error
204+
self.assertIsNotNone(
205+
await client.admin_conversations_convertToPublic(
206+
channel_id=created_channel_id,
207+
)
208+
)
209+
await asyncio.sleep(2) # To avoid internal_error
192210
self.assertIsNotNone(
193211
await client.admin_conversations_archive(
194212
channel_id=created_channel_id,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import asyncio
2+
import logging
3+
import os
4+
import time
5+
import unittest
6+
7+
from integration_tests.env_variable_names import (
8+
SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN,
9+
SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID,
10+
SLACK_SDK_TEST_GRID_TEAM_ID,
11+
SLACK_SDK_TEST_GRID_USER_ID,
12+
)
13+
from integration_tests.helpers import async_test
14+
from slack_sdk.web import WebClient
15+
from slack_sdk.web.async_client import AsyncWebClient
16+
17+
18+
class TestWebClient(unittest.TestCase):
19+
"""Runs integration tests with real Slack API"""
20+
21+
def setUp(self):
22+
self.org_admin_token = os.environ[SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN]
23+
24+
def tearDown(self):
25+
pass
26+
27+
def test_sync(self):
28+
client: WebClient = WebClient(token=self.org_admin_token)
29+
list_response = client.admin_roles_listAssignments(role_ids=["Rl0A"], limit=3, sort_dir="DESC")
30+
self.assertGreater(len(list_response.get("role_assignments", [])), 0)
31+
# TODO tests for add/remove
32+
33+
@async_test
34+
async def test_async(self):
35+
client: AsyncWebClient = AsyncWebClient(token=self.org_admin_token)
36+
list_response = await client.admin_roles_listAssignments(role_ids=["Rl0A"], limit=3, sort_dir="DESC")
37+
self.assertGreater(len(list_response.get("role_assignments", [])), 0)
38+
# TODO tests for add/remove

slack_sdk/web/async_client.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,18 @@ async def admin_conversations_convertToPrivate(
575575
kwargs.update({"channel_id": channel_id})
576576
return await self.api_call("admin.conversations.convertToPrivate", params=kwargs)
577577

578+
async def admin_conversations_convertToPublic(
579+
self,
580+
*,
581+
channel_id: str,
582+
**kwargs,
583+
) -> AsyncSlackResponse:
584+
"""Convert a privte channel to a public channel.
585+
https://api.slack.com/methods/admin.conversations.convertToPublic
586+
"""
587+
kwargs.update({"channel_id": channel_id})
588+
return await self.api_call("admin.conversations.convertToPublic", params=kwargs)
589+
578590
async def admin_conversations_setConversationPrefs(
579591
self,
580592
*,
@@ -621,6 +633,33 @@ async def admin_conversations_disconnectShared(
621633
kwargs.update({"leaving_team_ids": leaving_team_ids})
622634
return await self.api_call("admin.conversations.disconnectShared", params=kwargs)
623635

636+
async def admin_conversations_lookup(
637+
self,
638+
*,
639+
last_message_activity_before: int,
640+
team_ids: Union[str, Sequence[str]],
641+
cursor: Optional[str] = None,
642+
limit: Optional[int] = None,
643+
max_member_count: Optional[int] = None,
644+
**kwargs,
645+
) -> AsyncSlackResponse:
646+
"""Returns channels on the given team using the filters.
647+
https://api.slack.com/methods/admin.conversations.lookup
648+
"""
649+
kwargs.update(
650+
{
651+
"last_message_activity_before": last_message_activity_before,
652+
"cursor": cursor,
653+
"limit": limit,
654+
"max_member_count": max_member_count,
655+
}
656+
)
657+
if isinstance(team_ids, (list, Tuple)):
658+
kwargs.update({"team_ids": ",".join(team_ids)})
659+
else:
660+
kwargs.update({"team_ids": team_ids})
661+
return await self.api_call("admin.conversations.lookup", params=kwargs)
662+
624663
async def admin_conversations_ekm_listOriginalConnectedChannelInfo(
625664
self,
626665
*,
@@ -909,6 +948,75 @@ async def admin_emoji_rename(
909948
kwargs.update({"name": name, "new_name": new_name})
910949
return await self.api_call("admin.emoji.rename", http_verb="GET", params=kwargs)
911950

951+
async def admin_roles_addAssignments(
952+
self,
953+
*,
954+
role_id: str,
955+
entity_ids: Union[str, Sequence[str]],
956+
user_ids: Union[str, Sequence[str]],
957+
**kwargs,
958+
) -> AsyncSlackResponse:
959+
"""Adds members to the specified role with the specified scopes
960+
https://api.slack.com/methods/admin.roles.addAssignments
961+
"""
962+
kwargs.update({"role_id": role_id})
963+
if isinstance(entity_ids, (list, Tuple)):
964+
kwargs.update({"entity_ids": ",".join(entity_ids)})
965+
else:
966+
kwargs.update({"entity_ids": entity_ids})
967+
if isinstance(user_ids, (list, Tuple)):
968+
kwargs.update({"user_ids": ",".join(user_ids)})
969+
else:
970+
kwargs.update({"user_ids": user_ids})
971+
return await self.api_call("admin.roles.addAssignments", params=kwargs)
972+
973+
async def admin_roles_listAssignments(
974+
self,
975+
*,
976+
role_ids: Optional[Union[str, Sequence[str]]] = None,
977+
entity_ids: Optional[Union[str, Sequence[str]]] = None,
978+
cursor: Optional[str] = None,
979+
limit: Optional[Union[str, int]] = None,
980+
sort_dir: Optional[str] = None,
981+
**kwargs,
982+
) -> AsyncSlackResponse:
983+
"""Lists assignments for all roles across entities.
984+
Options to scope results by any combination of roles or entities
985+
https://api.slack.com/methods/admin.roles.listAssignments
986+
"""
987+
kwargs.update({"cursor": cursor, "limit": limit, "sort_dir": sort_dir})
988+
if isinstance(entity_ids, (list, Tuple)):
989+
kwargs.update({"entity_ids": ",".join(entity_ids)})
990+
else:
991+
kwargs.update({"entity_ids": entity_ids})
992+
if isinstance(role_ids, (list, Tuple)):
993+
kwargs.update({"role_ids": ",".join(role_ids)})
994+
else:
995+
kwargs.update({"role_ids": role_ids})
996+
return await self.api_call("admin.roles.listAssignments", params=kwargs)
997+
998+
async def admin_roles_removeAssignments(
999+
self,
1000+
*,
1001+
role_id: str,
1002+
entity_ids: Union[str, Sequence[str]],
1003+
user_ids: Union[str, Sequence[str]],
1004+
**kwargs,
1005+
) -> AsyncSlackResponse:
1006+
"""Removes a set of users from a role for the given scopes and entities
1007+
https://api.slack.com/methods/admin.roles.removeAssignments
1008+
"""
1009+
kwargs.update({"role_id": role_id})
1010+
if isinstance(entity_ids, (list, Tuple)):
1011+
kwargs.update({"entity_ids": ",".join(entity_ids)})
1012+
else:
1013+
kwargs.update({"entity_ids": entity_ids})
1014+
if isinstance(user_ids, (list, Tuple)):
1015+
kwargs.update({"user_ids": ",".join(user_ids)})
1016+
else:
1017+
kwargs.update({"user_ids": user_ids})
1018+
return await self.api_call("admin.roles.removeAssignments", params=kwargs)
1019+
9121020
async def admin_users_session_reset(
9131021
self,
9141022
*,

slack_sdk/web/client.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,18 @@ def admin_conversations_convertToPrivate(
566566
kwargs.update({"channel_id": channel_id})
567567
return self.api_call("admin.conversations.convertToPrivate", params=kwargs)
568568

569+
def admin_conversations_convertToPublic(
570+
self,
571+
*,
572+
channel_id: str,
573+
**kwargs,
574+
) -> SlackResponse:
575+
"""Convert a privte channel to a public channel.
576+
https://api.slack.com/methods/admin.conversations.convertToPublic
577+
"""
578+
kwargs.update({"channel_id": channel_id})
579+
return self.api_call("admin.conversations.convertToPublic", params=kwargs)
580+
569581
def admin_conversations_setConversationPrefs(
570582
self,
571583
*,
@@ -612,6 +624,33 @@ def admin_conversations_disconnectShared(
612624
kwargs.update({"leaving_team_ids": leaving_team_ids})
613625
return self.api_call("admin.conversations.disconnectShared", params=kwargs)
614626

627+
def admin_conversations_lookup(
628+
self,
629+
*,
630+
last_message_activity_before: int,
631+
team_ids: Union[str, Sequence[str]],
632+
cursor: Optional[str] = None,
633+
limit: Optional[int] = None,
634+
max_member_count: Optional[int] = None,
635+
**kwargs,
636+
) -> SlackResponse:
637+
"""Returns channels on the given team using the filters.
638+
https://api.slack.com/methods/admin.conversations.lookup
639+
"""
640+
kwargs.update(
641+
{
642+
"last_message_activity_before": last_message_activity_before,
643+
"cursor": cursor,
644+
"limit": limit,
645+
"max_member_count": max_member_count,
646+
}
647+
)
648+
if isinstance(team_ids, (list, Tuple)):
649+
kwargs.update({"team_ids": ",".join(team_ids)})
650+
else:
651+
kwargs.update({"team_ids": team_ids})
652+
return self.api_call("admin.conversations.lookup", params=kwargs)
653+
615654
def admin_conversations_ekm_listOriginalConnectedChannelInfo(
616655
self,
617656
*,
@@ -900,6 +939,75 @@ def admin_emoji_rename(
900939
kwargs.update({"name": name, "new_name": new_name})
901940
return self.api_call("admin.emoji.rename", http_verb="GET", params=kwargs)
902941

942+
def admin_roles_addAssignments(
943+
self,
944+
*,
945+
role_id: str,
946+
entity_ids: Union[str, Sequence[str]],
947+
user_ids: Union[str, Sequence[str]],
948+
**kwargs,
949+
) -> SlackResponse:
950+
"""Adds members to the specified role with the specified scopes
951+
https://api.slack.com/methods/admin.roles.addAssignments
952+
"""
953+
kwargs.update({"role_id": role_id})
954+
if isinstance(entity_ids, (list, Tuple)):
955+
kwargs.update({"entity_ids": ",".join(entity_ids)})
956+
else:
957+
kwargs.update({"entity_ids": entity_ids})
958+
if isinstance(user_ids, (list, Tuple)):
959+
kwargs.update({"user_ids": ",".join(user_ids)})
960+
else:
961+
kwargs.update({"user_ids": user_ids})
962+
return self.api_call("admin.roles.addAssignments", params=kwargs)
963+
964+
def admin_roles_listAssignments(
965+
self,
966+
*,
967+
role_ids: Optional[Union[str, Sequence[str]]] = None,
968+
entity_ids: Optional[Union[str, Sequence[str]]] = None,
969+
cursor: Optional[str] = None,
970+
limit: Optional[Union[str, int]] = None,
971+
sort_dir: Optional[str] = None,
972+
**kwargs,
973+
) -> SlackResponse:
974+
"""Lists assignments for all roles across entities.
975+
Options to scope results by any combination of roles or entities
976+
https://api.slack.com/methods/admin.roles.listAssignments
977+
"""
978+
kwargs.update({"cursor": cursor, "limit": limit, "sort_dir": sort_dir})
979+
if isinstance(entity_ids, (list, Tuple)):
980+
kwargs.update({"entity_ids": ",".join(entity_ids)})
981+
else:
982+
kwargs.update({"entity_ids": entity_ids})
983+
if isinstance(role_ids, (list, Tuple)):
984+
kwargs.update({"role_ids": ",".join(role_ids)})
985+
else:
986+
kwargs.update({"role_ids": role_ids})
987+
return self.api_call("admin.roles.listAssignments", params=kwargs)
988+
989+
def admin_roles_removeAssignments(
990+
self,
991+
*,
992+
role_id: str,
993+
entity_ids: Union[str, Sequence[str]],
994+
user_ids: Union[str, Sequence[str]],
995+
**kwargs,
996+
) -> SlackResponse:
997+
"""Removes a set of users from a role for the given scopes and entities
998+
https://api.slack.com/methods/admin.roles.removeAssignments
999+
"""
1000+
kwargs.update({"role_id": role_id})
1001+
if isinstance(entity_ids, (list, Tuple)):
1002+
kwargs.update({"entity_ids": ",".join(entity_ids)})
1003+
else:
1004+
kwargs.update({"entity_ids": entity_ids})
1005+
if isinstance(user_ids, (list, Tuple)):
1006+
kwargs.update({"user_ids": ",".join(user_ids)})
1007+
else:
1008+
kwargs.update({"user_ids": user_ids})
1009+
return self.api_call("admin.roles.removeAssignments", params=kwargs)
1010+
9031011
def admin_users_session_reset(
9041012
self,
9051013
*,

0 commit comments

Comments
 (0)