Skip to content

Commit

Permalink
Add five admin API supports to Web API clients (#1349)
Browse files Browse the repository at this point in the history
- admin.roles.addAssignments
- admin.roles.listAssignments
- admin.roles.removeAssignments
- admin.conversations.convertToPublic
- admin.conversations.lookup
  • Loading branch information
seratch committed Apr 7, 2023
1 parent 4b200f1 commit ec458ee
Show file tree
Hide file tree
Showing 6 changed files with 407 additions and 2 deletions.
18 changes: 18 additions & 0 deletions integration_tests/web/test_admin_conversations.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ def test_sync(self):
self.assertIsNotNone(conv_creation)
created_channel_id = conv_creation.data["channel_id"]

self.assertIsNotNone(client.admin_conversations_lookup(last_message_activity_before=100, team_ids=[self.team_id]))

self.assertIsNotNone(
client.admin_conversations_invite(
channel_id=created_channel_id,
Expand Down Expand Up @@ -108,6 +110,12 @@ def test_sync(self):
)
)
time.sleep(2) # To avoid internal_error
self.assertIsNotNone(
client.admin_conversations_convertToPublic(
channel_id=created_channel_id,
)
)
time.sleep(2) # To avoid internal_error
self.assertIsNotNone(
client.admin_conversations_archive(
channel_id=created_channel_id,
Expand All @@ -134,6 +142,10 @@ async def test_async(self):
self.assertIsNotNone(conv_creation)
created_channel_id = conv_creation.data["channel_id"]

self.assertIsNotNone(
await client.admin_conversations_lookup(last_message_activity_before=100, team_ids=[self.team_id])
)

self.assertIsNotNone(
await client.admin_conversations_invite(
channel_id=created_channel_id,
Expand Down Expand Up @@ -189,6 +201,12 @@ async def test_async(self):
)
)
await asyncio.sleep(2) # To avoid internal_error
self.assertIsNotNone(
await client.admin_conversations_convertToPublic(
channel_id=created_channel_id,
)
)
await asyncio.sleep(2) # To avoid internal_error
self.assertIsNotNone(
await client.admin_conversations_archive(
channel_id=created_channel_id,
Expand Down
38 changes: 38 additions & 0 deletions integration_tests/web/test_admin_roles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import asyncio
import logging
import os
import time
import unittest

from integration_tests.env_variable_names import (
SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN,
SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID,
SLACK_SDK_TEST_GRID_TEAM_ID,
SLACK_SDK_TEST_GRID_USER_ID,
)
from integration_tests.helpers import async_test
from slack_sdk.web import WebClient
from slack_sdk.web.async_client import AsyncWebClient


class TestWebClient(unittest.TestCase):
"""Runs integration tests with real Slack API"""

def setUp(self):
self.org_admin_token = os.environ[SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN]

def tearDown(self):
pass

def test_sync(self):
client: WebClient = WebClient(token=self.org_admin_token)
list_response = client.admin_roles_listAssignments(role_ids=["Rl0A"], limit=3, sort_dir="DESC")
self.assertGreater(len(list_response.get("role_assignments", [])), 0)
# TODO tests for add/remove

@async_test
async def test_async(self):
client: AsyncWebClient = AsyncWebClient(token=self.org_admin_token)
list_response = await client.admin_roles_listAssignments(role_ids=["Rl0A"], limit=3, sort_dir="DESC")
self.assertGreater(len(list_response.get("role_assignments", [])), 0)
# TODO tests for add/remove
108 changes: 108 additions & 0 deletions slack_sdk/web/async_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,18 @@ async def admin_conversations_convertToPrivate(
kwargs.update({"channel_id": channel_id})
return await self.api_call("admin.conversations.convertToPrivate", params=kwargs)

async def admin_conversations_convertToPublic(
self,
*,
channel_id: str,
**kwargs,
) -> AsyncSlackResponse:
"""Convert a privte channel to a public channel.
https://api.slack.com/methods/admin.conversations.convertToPublic
"""
kwargs.update({"channel_id": channel_id})
return await self.api_call("admin.conversations.convertToPublic", params=kwargs)

async def admin_conversations_setConversationPrefs(
self,
*,
Expand Down Expand Up @@ -621,6 +633,33 @@ async def admin_conversations_disconnectShared(
kwargs.update({"leaving_team_ids": leaving_team_ids})
return await self.api_call("admin.conversations.disconnectShared", params=kwargs)

async def admin_conversations_lookup(
self,
*,
last_message_activity_before: int,
team_ids: Union[str, Sequence[str]],
cursor: Optional[str] = None,
limit: Optional[int] = None,
max_member_count: Optional[int] = None,
**kwargs,
) -> AsyncSlackResponse:
"""Returns channels on the given team using the filters.
https://api.slack.com/methods/admin.conversations.lookup
"""
kwargs.update(
{
"last_message_activity_before": last_message_activity_before,
"cursor": cursor,
"limit": limit,
"max_member_count": max_member_count,
}
)
if isinstance(team_ids, (list, Tuple)):
kwargs.update({"team_ids": ",".join(team_ids)})
else:
kwargs.update({"team_ids": team_ids})
return await self.api_call("admin.conversations.lookup", params=kwargs)

async def admin_conversations_ekm_listOriginalConnectedChannelInfo(
self,
*,
Expand Down Expand Up @@ -909,6 +948,75 @@ async def admin_emoji_rename(
kwargs.update({"name": name, "new_name": new_name})
return await self.api_call("admin.emoji.rename", http_verb="GET", params=kwargs)

async def admin_roles_addAssignments(
self,
*,
role_id: str,
entity_ids: Union[str, Sequence[str]],
user_ids: Union[str, Sequence[str]],
**kwargs,
) -> AsyncSlackResponse:
"""Adds members to the specified role with the specified scopes
https://api.slack.com/methods/admin.roles.addAssignments
"""
kwargs.update({"role_id": role_id})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(user_ids, (list, Tuple)):
kwargs.update({"user_ids": ",".join(user_ids)})
else:
kwargs.update({"user_ids": user_ids})
return await self.api_call("admin.roles.addAssignments", params=kwargs)

async def admin_roles_listAssignments(
self,
*,
role_ids: Optional[Union[str, Sequence[str]]] = None,
entity_ids: Optional[Union[str, Sequence[str]]] = None,
cursor: Optional[str] = None,
limit: Optional[Union[str, int]] = None,
sort_dir: Optional[str] = None,
**kwargs,
) -> AsyncSlackResponse:
"""Lists assignments for all roles across entities.
Options to scope results by any combination of roles or entities
https://api.slack.com/methods/admin.roles.listAssignments
"""
kwargs.update({"cursor": cursor, "limit": limit, "sort_dir": sort_dir})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(role_ids, (list, Tuple)):
kwargs.update({"role_ids": ",".join(role_ids)})
else:
kwargs.update({"role_ids": role_ids})
return await self.api_call("admin.roles.listAssignments", params=kwargs)

async def admin_roles_removeAssignments(
self,
*,
role_id: str,
entity_ids: Union[str, Sequence[str]],
user_ids: Union[str, Sequence[str]],
**kwargs,
) -> AsyncSlackResponse:
"""Removes a set of users from a role for the given scopes and entities
https://api.slack.com/methods/admin.roles.removeAssignments
"""
kwargs.update({"role_id": role_id})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(user_ids, (list, Tuple)):
kwargs.update({"user_ids": ",".join(user_ids)})
else:
kwargs.update({"user_ids": user_ids})
return await self.api_call("admin.roles.removeAssignments", params=kwargs)

async def admin_users_session_reset(
self,
*,
Expand Down
108 changes: 108 additions & 0 deletions slack_sdk/web/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,18 @@ def admin_conversations_convertToPrivate(
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.convertToPrivate", params=kwargs)

def admin_conversations_convertToPublic(
self,
*,
channel_id: str,
**kwargs,
) -> SlackResponse:
"""Convert a privte channel to a public channel.
https://api.slack.com/methods/admin.conversations.convertToPublic
"""
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.convertToPublic", params=kwargs)

def admin_conversations_setConversationPrefs(
self,
*,
Expand Down Expand Up @@ -612,6 +624,33 @@ def admin_conversations_disconnectShared(
kwargs.update({"leaving_team_ids": leaving_team_ids})
return self.api_call("admin.conversations.disconnectShared", params=kwargs)

def admin_conversations_lookup(
self,
*,
last_message_activity_before: int,
team_ids: Union[str, Sequence[str]],
cursor: Optional[str] = None,
limit: Optional[int] = None,
max_member_count: Optional[int] = None,
**kwargs,
) -> SlackResponse:
"""Returns channels on the given team using the filters.
https://api.slack.com/methods/admin.conversations.lookup
"""
kwargs.update(
{
"last_message_activity_before": last_message_activity_before,
"cursor": cursor,
"limit": limit,
"max_member_count": max_member_count,
}
)
if isinstance(team_ids, (list, Tuple)):
kwargs.update({"team_ids": ",".join(team_ids)})
else:
kwargs.update({"team_ids": team_ids})
return self.api_call("admin.conversations.lookup", params=kwargs)

def admin_conversations_ekm_listOriginalConnectedChannelInfo(
self,
*,
Expand Down Expand Up @@ -900,6 +939,75 @@ def admin_emoji_rename(
kwargs.update({"name": name, "new_name": new_name})
return self.api_call("admin.emoji.rename", http_verb="GET", params=kwargs)

def admin_roles_addAssignments(
self,
*,
role_id: str,
entity_ids: Union[str, Sequence[str]],
user_ids: Union[str, Sequence[str]],
**kwargs,
) -> SlackResponse:
"""Adds members to the specified role with the specified scopes
https://api.slack.com/methods/admin.roles.addAssignments
"""
kwargs.update({"role_id": role_id})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(user_ids, (list, Tuple)):
kwargs.update({"user_ids": ",".join(user_ids)})
else:
kwargs.update({"user_ids": user_ids})
return self.api_call("admin.roles.addAssignments", params=kwargs)

def admin_roles_listAssignments(
self,
*,
role_ids: Optional[Union[str, Sequence[str]]] = None,
entity_ids: Optional[Union[str, Sequence[str]]] = None,
cursor: Optional[str] = None,
limit: Optional[Union[str, int]] = None,
sort_dir: Optional[str] = None,
**kwargs,
) -> SlackResponse:
"""Lists assignments for all roles across entities.
Options to scope results by any combination of roles or entities
https://api.slack.com/methods/admin.roles.listAssignments
"""
kwargs.update({"cursor": cursor, "limit": limit, "sort_dir": sort_dir})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(role_ids, (list, Tuple)):
kwargs.update({"role_ids": ",".join(role_ids)})
else:
kwargs.update({"role_ids": role_ids})
return self.api_call("admin.roles.listAssignments", params=kwargs)

def admin_roles_removeAssignments(
self,
*,
role_id: str,
entity_ids: Union[str, Sequence[str]],
user_ids: Union[str, Sequence[str]],
**kwargs,
) -> SlackResponse:
"""Removes a set of users from a role for the given scopes and entities
https://api.slack.com/methods/admin.roles.removeAssignments
"""
kwargs.update({"role_id": role_id})
if isinstance(entity_ids, (list, Tuple)):
kwargs.update({"entity_ids": ",".join(entity_ids)})
else:
kwargs.update({"entity_ids": entity_ids})
if isinstance(user_ids, (list, Tuple)):
kwargs.update({"user_ids": ",".join(user_ids)})
else:
kwargs.update({"user_ids": user_ids})
return self.api_call("admin.roles.removeAssignments", params=kwargs)

def admin_users_session_reset(
self,
*,
Expand Down

0 comments on commit ec458ee

Please sign in to comment.