Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #1049 by correcting request body format and next_cursor extraction #1061

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -40,3 +40,5 @@ tmp.txt
logs/

.pytype/
*.db
.env*
16 changes: 8 additions & 8 deletions slack_sdk/web/async_client.py
Expand Up @@ -393,7 +393,7 @@ async def admin_conversations_rename(

async def admin_conversations_search(self, **kwargs) -> AsyncSlackResponse:
"""Search for public or private channels in an Enterprise organization."""
return await self.api_call("admin.conversations.search", json=kwargs)
return await self.api_call("admin.conversations.search", params=kwargs)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I mentioned in the description, the api_call with the JSON request body is not compatible with the iterator by SlackResponse.


async def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -538,7 +538,7 @@ async def admin_conversations_getTeams(

"""
kwargs.update({"channel_id": channel_id})
return await self.api_call("admin.conversations.getTeams", json=kwargs)
return await self.api_call("admin.conversations.getTeams", params=kwargs)

async def admin_emoji_add(self, **kwargs) -> AsyncSlackResponse:
"""Add an emoji."""
Expand Down Expand Up @@ -668,11 +668,11 @@ async def admin_inviteRequests_approve(

async def admin_inviteRequests_approved_list(self, **kwargs) -> AsyncSlackResponse:
"""List all approved workspace invite requests."""
return await self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return await self.api_call("admin.inviteRequests.approved.list", params=kwargs)

async def admin_inviteRequests_denied_list(self, **kwargs) -> AsyncSlackResponse:
"""List all denied workspace invite requests."""
return await self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return await self.api_call("admin.inviteRequests.denied.list", params=kwargs)

async def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -687,7 +687,7 @@ async def admin_inviteRequests_deny(

async def admin_inviteRequests_list(self, **kwargs) -> AsyncSlackResponse:
"""List all pending workspace invite requests."""
return await self.api_call("admin.inviteRequests.list", json=kwargs)
return await self.api_call("admin.inviteRequests.list", params=kwargs)

async def admin_teams_admins_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -716,7 +716,7 @@ async def admin_teams_create(

async def admin_teams_list(self, **kwargs) -> AsyncSlackResponse:
"""List all teams on an Enterprise organization."""
return await self.api_call("admin.teams.list", json=kwargs)
return await self.api_call("admin.teams.list", params=kwargs)

async def admin_teams_owners_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -904,7 +904,7 @@ async def admin_users_list(self, *, team_id: str, **kwargs) -> AsyncSlackRespons
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return await self.api_call("admin.users.list", json=kwargs)
return await self.api_call("admin.users.list", params=kwargs)

async def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1392,7 +1392,7 @@ async def chat_update(

async def chat_scheduledMessages_list(self, **kwargs) -> AsyncSlackResponse:
"""Lists all scheduled messages."""
return await self.api_call("chat.scheduledMessages.list", json=kwargs)
return await self.api_call("chat.scheduledMessages.list", params=kwargs)

async def conversations_archive(
self, *, channel: str, **kwargs
Expand Down
16 changes: 8 additions & 8 deletions slack_sdk/web/client.py
Expand Up @@ -364,7 +364,7 @@ def admin_conversations_rename(

def admin_conversations_search(self, **kwargs) -> SlackResponse:
"""Search for public or private channels in an Enterprise organization."""
return self.api_call("admin.conversations.search", json=kwargs)
return self.api_call("admin.conversations.search", params=kwargs)

def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -505,7 +505,7 @@ def admin_conversations_getTeams(

"""
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.getTeams", json=kwargs)
return self.api_call("admin.conversations.getTeams", params=kwargs)

def admin_emoji_add(self, **kwargs) -> SlackResponse:
"""Add an emoji."""
Expand Down Expand Up @@ -631,11 +631,11 @@ def admin_inviteRequests_approve(

def admin_inviteRequests_approved_list(self, **kwargs) -> SlackResponse:
"""List all approved workspace invite requests."""
return self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return self.api_call("admin.inviteRequests.approved.list", params=kwargs)

def admin_inviteRequests_denied_list(self, **kwargs) -> SlackResponse:
"""List all denied workspace invite requests."""
return self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return self.api_call("admin.inviteRequests.denied.list", params=kwargs)

def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -650,7 +650,7 @@ def admin_inviteRequests_deny(

def admin_inviteRequests_list(self, **kwargs) -> SlackResponse:
"""List all pending workspace invite requests."""
return self.api_call("admin.inviteRequests.list", json=kwargs)
return self.api_call("admin.inviteRequests.list", params=kwargs)

def admin_teams_admins_list(self, *, team_id: str, **kwargs) -> SlackResponse:
"""List all of the admins on a given workspace.
Expand All @@ -675,7 +675,7 @@ def admin_teams_create(

def admin_teams_list(self, **kwargs) -> SlackResponse:
"""List all teams on an Enterprise organization."""
return self.api_call("admin.teams.list", json=kwargs)
return self.api_call("admin.teams.list", params=kwargs)

def admin_teams_owners_list(self, *, team_id: str, **kwargs) -> SlackResponse:
"""List all of the admins on a given workspace.
Expand Down Expand Up @@ -855,7 +855,7 @@ def admin_users_list(self, *, team_id: str, **kwargs) -> SlackResponse:
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return self.api_call("admin.users.list", json=kwargs)
return self.api_call("admin.users.list", params=kwargs)

def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1313,7 +1313,7 @@ def chat_update(self, *, channel: str, ts: str, **kwargs) -> SlackResponse:

def chat_scheduledMessages_list(self, **kwargs) -> SlackResponse:
"""Lists all scheduled messages."""
return self.api_call("chat.scheduledMessages.list", json=kwargs)
return self.api_call("chat.scheduledMessages.list", params=kwargs)

def conversations_archive(self, *, channel: str, **kwargs) -> SlackResponse:
"""Archives a conversation.
Expand Down
3 changes: 2 additions & 1 deletion slack_sdk/web/internal_utils.py
Expand Up @@ -219,7 +219,8 @@ def _next_cursor_is_present(data) -> bool:
Returns:
A boolean value.
"""
present = (
# Only admin.conversations.search returns next_cursor at the top level
present = ("next_cursor" in data and data["next_cursor"] != "") or (
"response_metadata" in data
and "next_cursor" in data["response_metadata"]
and data["response_metadata"]["next_cursor"] != ""
Expand Down
16 changes: 8 additions & 8 deletions slack_sdk/web/legacy_client.py
Expand Up @@ -381,7 +381,7 @@ def admin_conversations_rename(

def admin_conversations_search(self, **kwargs) -> Union[Future, SlackResponse]:
"""Search for public or private channels in an Enterprise organization."""
return self.api_call("admin.conversations.search", json=kwargs)
return self.api_call("admin.conversations.search", params=kwargs)

def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -522,7 +522,7 @@ def admin_conversations_getTeams(

"""
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.getTeams", json=kwargs)
return self.api_call("admin.conversations.getTeams", params=kwargs)

def admin_emoji_add(self, **kwargs) -> Union[Future, SlackResponse]:
"""Add an emoji."""
Expand Down Expand Up @@ -652,13 +652,13 @@ def admin_inviteRequests_approved_list(
self, **kwargs
) -> Union[Future, SlackResponse]:
"""List all approved workspace invite requests."""
return self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return self.api_call("admin.inviteRequests.approved.list", params=kwargs)

def admin_inviteRequests_denied_list(
self, **kwargs
) -> Union[Future, SlackResponse]:
"""List all denied workspace invite requests."""
return self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return self.api_call("admin.inviteRequests.denied.list", params=kwargs)

def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -673,7 +673,7 @@ def admin_inviteRequests_deny(

def admin_inviteRequests_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""List all pending workspace invite requests."""
return self.api_call("admin.inviteRequests.list", json=kwargs)
return self.api_call("admin.inviteRequests.list", params=kwargs)

def admin_teams_admins_list(
self, *, team_id: str, **kwargs
Expand All @@ -700,7 +700,7 @@ def admin_teams_create(

def admin_teams_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""List all teams on an Enterprise organization."""
return self.api_call("admin.teams.list", json=kwargs)
return self.api_call("admin.teams.list", params=kwargs)

def admin_teams_owners_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -886,7 +886,7 @@ def admin_users_list(
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return self.api_call("admin.users.list", json=kwargs)
return self.api_call("admin.users.list", params=kwargs)

def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1378,7 +1378,7 @@ def chat_update(

def chat_scheduledMessages_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""Lists all scheduled messages."""
return self.api_call("chat.scheduledMessages.list", json=kwargs)
return self.api_call("chat.scheduledMessages.list", params=kwargs)

def conversations_archive(
self, *, channel: str, **kwargs
Expand Down
5 changes: 4 additions & 1 deletion slack_sdk/web/slack_response.py
Expand Up @@ -142,7 +142,10 @@ def __next__(self):
params = self.req_args.get("params", {})
if params is None:
params = {}
params.update({"cursor": self.data["response_metadata"]["next_cursor"]})
next_cursor = self.data.get("response_metadata", {}).get(
"next_cursor"
) or self.data.get("next_cursor")
params.update({"cursor": next_cursor})
self.req_args.update({"params": params})

# This method sends a request in a synchronous way
Expand Down
26 changes: 26 additions & 0 deletions tests/slack_sdk/web/test_web_client_issue_1049.py
@@ -0,0 +1,26 @@
import json
import unittest

from slack_sdk.web import WebClient
from tests.slack_sdk.web.mock_web_api_server import (
setup_mock_web_api_server,
cleanup_mock_web_api_server,
)


class TestWebClient_Issue_1049(unittest.TestCase):
def setUp(self):
setup_mock_web_api_server(self)

def tearDown(self):
cleanup_mock_web_api_server(self)

def test_the_pattern(self):
client = WebClient(
base_url="http://localhost:8888",
token="xoxb-admin_convo_pagination",
)
pages = []
for page in client.admin_conversations_search(query="announcement"):
pages.append(page)
self.assertEqual(len(pages), 2)
28 changes: 28 additions & 0 deletions tests/slack_sdk_fixture/web_response_admin_convo_pagination.json
@@ -0,0 +1,28 @@
{
"ok": true,
"conversations": [
{
"id": "C013T0FTKU3",
"name": "random",
"purpose": "test",
"member_count": 11,
"created": 1589700571,
"creator_id": "W111",
"is_private": false,
"is_archived": false,
"is_general": false,
"last_activity_ts": 1599130434000900,
"is_ext_shared": false,
"is_global_shared": false,
"is_org_default": false,
"is_org_mandatory": false,
"is_org_shared": false,
"is_frozen": false,
"internal_team_ids_count": 1,
"internal_team_ids_sample_team": "T111",
"pending_connected_team_ids": [],
"is_pending_ext_shared": false
}
],
"next_cursor": "1"
}
@@ -0,0 +1,5 @@
{
"ok": true,
"conversations": [],
"next_cursor": ""
}