From b17d76cc9545560157715b43c034da29d5a9516d Mon Sep 17 00:00:00 2001 From: kanat Date: Tue, 27 Feb 2024 08:54:09 -0800 Subject: [PATCH 1/4] [PBE-1392] add stop_at support --- stream_chat/async_chat/campaign.py | 6 ++++-- stream_chat/async_chat/client.py | 5 +++++ stream_chat/base/campaign.py | 4 +++- stream_chat/base/client.py | 1 + stream_chat/campaign.py | 6 ++++-- stream_chat/client.py | 5 +++++ stream_chat/tests/async_chat/test_campaign.py | 5 ++++- stream_chat/tests/test_campaign.py | 3 ++- 8 files changed, 28 insertions(+), 7 deletions(-) diff --git a/stream_chat/async_chat/campaign.py b/stream_chat/async_chat/campaign.py index 521e7a81..4dfd8e90 100644 --- a/stream_chat/async_chat/campaign.py +++ b/stream_chat/async_chat/campaign.py @@ -38,10 +38,12 @@ async def delete(self, **options: Any) -> StreamResponse: ) async def start( - self, scheduled_for: Optional[Union[str, datetime.datetime]] = None + self, + scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> StreamResponse: return await self.client.start_campaign( # type: ignore - campaign_id=self.campaign_id, scheduled_for=scheduled_for + campaign_id=self.campaign_id, scheduled_for=scheduled_for, stop_at=stop_at ) async def stop(self) -> StreamResponse: diff --git a/stream_chat/async_chat/client.py b/stream_chat/async_chat/client.py index 05ad3e8b..8c5f882a 100644 --- a/stream_chat/async_chat/client.py +++ b/stream_chat/async_chat/client.py @@ -676,12 +676,17 @@ async def start_campaign( self, campaign_id: str, scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> StreamResponse: payload = {} if scheduled_for is not None: if isinstance(scheduled_for, datetime.datetime): scheduled_for = scheduled_for.isoformat() payload["scheduled_for"] = scheduled_for + if stop_at is not None: + if isinstance(stop_at, datetime.datetime): + stop_at = stop_at.isoformat() + payload["stop_at"] = stop_at return await self.post(f"campaigns/{campaign_id}/start", data=payload) async def stop_campaign(self, campaign_id: str) -> StreamResponse: diff --git a/stream_chat/base/campaign.py b/stream_chat/base/campaign.py index bbe5f196..70aba770 100644 --- a/stream_chat/base/campaign.py +++ b/stream_chat/base/campaign.py @@ -40,7 +40,9 @@ def delete(self) -> Union[StreamResponse, Awaitable[StreamResponse]]: @abc.abstractmethod def start( - self, scheduled_for: Optional[Union[str, datetime.datetime]] = None + self, + scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> Union[StreamResponse, Awaitable[StreamResponse]]: pass diff --git a/stream_chat/base/client.py b/stream_chat/base/client.py index 38ef942a..7d5ddf77 100644 --- a/stream_chat/base/client.py +++ b/stream_chat/base/client.py @@ -1102,6 +1102,7 @@ def start_campaign( self, campaign_id: str, scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> Union[StreamResponse, Awaitable[StreamResponse]]: """ Start a campaign at given time or now if not specified diff --git a/stream_chat/campaign.py b/stream_chat/campaign.py index 3063a8ce..b9eafea0 100644 --- a/stream_chat/campaign.py +++ b/stream_chat/campaign.py @@ -36,10 +36,12 @@ def delete(self, **options: Any) -> StreamResponse: ) def start( - self, scheduled_for: Optional[Union[str, datetime.datetime]] = None + self, + scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> StreamResponse: return self.client.start_campaign( # type: ignore - campaign_id=self.campaign_id, scheduled_for=scheduled_for + campaign_id=self.campaign_id, scheduled_for=scheduled_for, stop_at=stop_at ) def stop(self) -> StreamResponse: diff --git a/stream_chat/client.py b/stream_chat/client.py index 9b4aac41..06bf3d55 100644 --- a/stream_chat/client.py +++ b/stream_chat/client.py @@ -649,12 +649,17 @@ def start_campaign( self, campaign_id: str, scheduled_for: Optional[Union[str, datetime.datetime]] = None, + stop_at: Optional[Union[str, datetime.datetime]] = None, ) -> StreamResponse: payload = {} if scheduled_for is not None: if isinstance(scheduled_for, datetime.datetime): scheduled_for = scheduled_for.isoformat() payload["scheduled_for"] = scheduled_for + if stop_at is not None: + if isinstance(stop_at, datetime.datetime): + stop_at = stop_at.isoformat() + payload["stop_at"] = stop_at return self.post(f"campaigns/{campaign_id}/start", data=payload) def stop_campaign(self, campaign_id: str) -> StreamResponse: diff --git a/stream_chat/tests/async_chat/test_campaign.py b/stream_chat/tests/async_chat/test_campaign.py index beefb1af..24be9dcc 100644 --- a/stream_chat/tests/async_chat/test_campaign.py +++ b/stream_chat/tests/async_chat/test_campaign.py @@ -92,8 +92,11 @@ async def test_campaign_start_stop( now = datetime.datetime.now(datetime.timezone.utc) one_hour_later = now + datetime.timedelta(hours=1) + two_hours_later = now + datetime.timedelta(hours=2) - started = await campaign.start(scheduled_for=one_hour_later) + started = await campaign.start( + scheduled_for=one_hour_later, stop_at=two_hours_later + ) assert started.is_ok() assert "campaign" in started assert "id" in started["campaign"] diff --git a/stream_chat/tests/test_campaign.py b/stream_chat/tests/test_campaign.py index b8d9c892..30835009 100644 --- a/stream_chat/tests/test_campaign.py +++ b/stream_chat/tests/test_campaign.py @@ -96,8 +96,9 @@ def test_campaign_start_stop(self, client: StreamChat, random_user: Dict): now = datetime.datetime.now(datetime.timezone.utc) one_hour_later = now + datetime.timedelta(hours=1) + two_hours_later = now + datetime.timedelta(hours=2) - started = campaign.start(scheduled_for=one_hour_later) + started = campaign.start(scheduled_for=one_hour_later, stop_at=two_hours_later) assert started.is_ok() assert "campaign" in started assert "id" in started["campaign"] From bfa24b22c4ebb6e79af8463edca35064151e9858 Mon Sep 17 00:00:00 2001 From: kanat Date: Tue, 27 Feb 2024 10:24:46 -0800 Subject: [PATCH 2/4] [PBE-1392] add members to channel_template --- stream_chat/client.py | 2 +- stream_chat/types/campaign.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/stream_chat/client.py b/stream_chat/client.py index 06bf3d55..3219b5b2 100644 --- a/stream_chat/client.py +++ b/stream_chat/client.py @@ -609,7 +609,7 @@ def remove_segment_targets( ) def campaign( # type: ignore - self, campaign_id: Optional[str] = None, data: CampaignData = None + self, campaign_id: Optional[str] = None, data: Optional[CampaignData] = None ) -> Campaign: return Campaign(client=self, campaign_id=campaign_id, data=data) diff --git a/stream_chat/types/campaign.py b/stream_chat/types/campaign.py index 2e401dcb..bc1b7306 100644 --- a/stream_chat/types/campaign.py +++ b/stream_chat/types/campaign.py @@ -31,11 +31,13 @@ class ChannelTemplate(TypedDict, total=False): Parameters: type: The type of channel. id: The ID of the channel. + members: List of member IDs. custom: Custom data. """ type: str - id: str + id: Optional[str] + members: Optional[List[str]] custom: Optional[Dict] From 65371a5f5126c09e8384f8a5c6aee30cc1a4fc54 Mon Sep 17 00:00:00 2001 From: kanat Date: Tue, 27 Feb 2024 10:59:33 -0800 Subject: [PATCH 3/4] [PBE-1392] fix blocklist tests --- stream_chat/tests/async_chat/test_client.py | 2 +- stream_chat/tests/test_client.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stream_chat/tests/async_chat/test_client.py b/stream_chat/tests/async_chat/test_client.py index 4d4c7113..e40a7400 100644 --- a/stream_chat/tests/async_chat/test_client.py +++ b/stream_chat/tests/async_chat/test_client.py @@ -580,7 +580,7 @@ async def test_query_channels_members_in( assert len(response["channels"][0]["members"]) == 9 async def test_create_blocklist(self, client: StreamChatAsync): - await client.create_blocklist(name="Foo", words=["fudge", "heck"]) + await client.create_blocklist(name="Foo", words=["fudge", "heck"], type="word") async def test_list_blocklists(self, client: StreamChatAsync): response = await client.list_blocklists() diff --git a/stream_chat/tests/test_client.py b/stream_chat/tests/test_client.py index 97ca9c43..e600049a 100644 --- a/stream_chat/tests/test_client.py +++ b/stream_chat/tests/test_client.py @@ -549,7 +549,7 @@ def test_query_channels_members_in( assert len(response["channels"][0]["members"]) == 9 def test_create_blocklist(self, client: StreamChat): - client.create_blocklist(name="Foo", words=["fudge", "heck"], type="regular") + client.create_blocklist(name="Foo", words=["fudge", "heck"], type="word") def test_list_blocklists(self, client: StreamChat): response = client.list_blocklists() From f1f08e9479c9ce0d5fe8e661a52fce2d3033ec95 Mon Sep 17 00:00:00 2001 From: kanat Date: Tue, 27 Feb 2024 11:25:24 -0800 Subject: [PATCH 4/4] [PBE-1392] change the default blocklist type --- stream_chat/async_chat/client.py | 2 +- stream_chat/base/client.py | 2 +- stream_chat/client.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stream_chat/async_chat/client.py b/stream_chat/async_chat/client.py index 8c5f882a..f46e1f03 100644 --- a/stream_chat/async_chat/client.py +++ b/stream_chat/async_chat/client.py @@ -485,7 +485,7 @@ async def send_file( return await self._parse_response(response) async def create_blocklist( - self, name: str, words: Iterable[str], type: str = "regular" + self, name: str, words: Iterable[str], type: str = "word" ) -> StreamResponse: return await self.post( "blocklists", data={"name": name, "words": words, "type": type} diff --git a/stream_chat/base/client.py b/stream_chat/base/client.py index 7d5ddf77..747a9894 100644 --- a/stream_chat/base/client.py +++ b/stream_chat/base/client.py @@ -765,7 +765,7 @@ def send_file( @abc.abstractmethod def create_blocklist( - self, name: str, words: Iterable[str], type: str = "regular" + self, name: str, words: Iterable[str], type: str = "word" ) -> Union[StreamResponse, Awaitable[StreamResponse]]: """ Create a blocklist diff --git a/stream_chat/client.py b/stream_chat/client.py index 3219b5b2..ece696bc 100644 --- a/stream_chat/client.py +++ b/stream_chat/client.py @@ -467,7 +467,7 @@ def send_file( return self._parse_response(response) def create_blocklist( - self, name: str, words: Iterable[str], type: str = "regular" + self, name: str, words: Iterable[str], type: str = "word" ) -> StreamResponse: return self.post( "blocklists", data={"name": name, "words": words, "type": type}