@@ -257,11 +257,177 @@ async def cancel_subscription(self, subscription_id: str) -> None:
257257 except ClientError : # pragma: no cover
258258 raise
259259
260+ async def suspend_subscription (self ,
261+ subscription_id : str ,
262+ details : Optional [str ] = None ) -> dict :
263+ """Suspend a Subscription.
264+
265+ Args:
266+ subscription_id (str): id of subscription to suspend.
267+ details (str): optional details explaining the reason
268+ for suspension.
269+
270+ Returns:
271+ dict: the suspended subscription.
272+
273+ Raises:
274+ APIError: on an API server error.
275+ ClientError: on a client error.
276+ """
277+ url = f'{ self ._base_url } /{ subscription_id } /suspend'
278+ json_body = {'details' : details } if details is not None else None
279+
280+ try :
281+ resp = await self ._session .request (method = 'POST' ,
282+ url = url ,
283+ json = json_body )
284+ # Forward APIError. We don't strictly need this clause, but it
285+ # makes our intent clear.
286+ except APIError :
287+ raise
288+ except ClientError : # pragma: no cover
289+ raise
290+ else :
291+ return resp .json ()
292+
293+ async def reactivate_subscription (self , subscription_id : str ) -> None :
294+ """Reactivate a Subscription.
295+
296+ Args:
297+ subscription_id (str): id of subscription to reactivate.
298+
299+ Returns:
300+ None
301+
302+ Raises:
303+ APIError: on an API server error.
304+ ClientError: on a client error.
305+ """
306+ url = f'{ self ._base_url } /{ subscription_id } /reactivate'
307+
308+ try :
309+ _ = await self ._session .request (method = 'POST' , url = url )
310+ # Forward APIError. We don't strictly need this clause, but it
311+ # makes our intent clear.
312+ except APIError :
313+ raise
314+ except ClientError : # pragma: no cover
315+ raise
316+
317+ async def bulk_suspend_subscriptions (
318+ self ,
319+ subscription_ids : Optional [List [str ]] = None ,
320+ details : Optional [str ] = None ,
321+ all_subscriptions : bool = False ) -> None :
322+ """Suspend multiple Subscriptions.
323+
324+ This method supports three modes of operation:
325+
326+ 1. Suspend specific subscriptions: provide subscription_ids
327+ 2. Suspend all user's subscriptions: call with no parameters
328+ 3. Suspend all organization subscriptions: set all_subscriptions=True
329+ (organization admin only)
330+
331+ Args:
332+ subscription_ids (List[str]): list of subscription ids
333+ to suspend. If not provided and all_subscriptions is False,
334+ suspends all of the user's subscriptions.
335+ details (str): optional details explaining the reason
336+ for suspension.
337+ all_subscriptions (bool): if True, suspend all
338+ subscriptions for the organization (requires organization
339+ admin permissions). Mutually exclusive with subscription_ids.
340+
341+ Returns:
342+ None
343+
344+ Raises:
345+ ClientError: if both subscription_ids and all_subscriptions are
346+ provided.
347+ APIError: on an API server error.
348+ """
349+ if subscription_ids and all_subscriptions :
350+ raise ClientError (
351+ 'Cannot specify both subscription_ids and all_subscriptions' )
352+
353+ url = f'{ self ._base_url } /suspend'
354+ params = {'user_id' : 'all' } if all_subscriptions else None
355+ payload : Dict [str , Any ] = {}
356+ if subscription_ids is not None :
357+ payload ["subscription_ids" ] = subscription_ids
358+ if details is not None :
359+ payload ["details" ] = details
360+ json_body : Optional [Dict [str , Any ]] = payload or None
361+
362+ try :
363+ _ = await self ._session .request (method = 'POST' ,
364+ url = url ,
365+ json = json_body ,
366+ params = params )
367+ # Forward APIError. We don't strictly need this clause, but it
368+ # makes our intent clear.
369+ except APIError :
370+ raise
371+ except ClientError : # pragma: no cover
372+ raise
373+
374+ async def bulk_reactivate_subscriptions (
375+ self ,
376+ subscription_ids : Optional [List [str ]] = None ,
377+ all_subscriptions : bool = False ) -> None :
378+ """Reactivate multiple Subscriptions.
379+
380+ This method supports three modes of operation:
381+
382+ 1. Reactivate specific subscriptions: provide subscription_ids
383+ 2. Reactivate all user's subscriptions: call with no parameters
384+ 3. Reactivate all organization subscriptions: set all_subscriptions=True
385+ (organization admin only)
386+
387+ Args:
388+ subscription_ids (List[str]): list of subscription ids
389+ to reactivate. If not provided and all_subscriptions is False,
390+ reactivates all of the user's subscriptions.
391+ all_subscriptions (bool): if True, reactivate all
392+ subscriptions for the organization (requires organization
393+ admin permissions). Mutually exclusive with subscription_ids.
394+
395+ Returns:
396+ None
397+
398+ Raises:
399+ ClientError: if both subscription_ids and all_subscriptions are
400+ provided.
401+ APIError: on an API server error.
402+ """
403+ if subscription_ids and all_subscriptions :
404+ raise ClientError (
405+ 'Cannot specify both subscription_ids and all_subscriptions' )
406+
407+ url = f'{ self ._base_url } /reactivate'
408+ params = {'user_id' : 'all' } if all_subscriptions else None
409+ payload : Dict [str , Any ] = {}
410+ if subscription_ids is not None :
411+ payload ["subscription_ids" ] = subscription_ids
412+ json_body : Optional [Dict [str , Any ]] = payload or None
413+
414+ try :
415+ _ = await self ._session .request (method = 'POST' ,
416+ url = url ,
417+ json = json_body ,
418+ params = params )
419+ # Forward APIError. We don't strictly need this clause, but it
420+ # makes our intent clear.
421+ except APIError :
422+ raise
423+ except ClientError : # pragma: no cover
424+ raise
425+
260426 async def update_subscription (self , subscription_id : str ,
261427 request : dict ) -> dict :
262428 """Update (edit) a Subscription via PUT.
263429
264- Args
430+ Args:
265431 subscription_id (str): id of the subscription to update.
266432 request (dict): subscription content for update, full
267433 payload is required.
@@ -293,7 +459,7 @@ async def patch_subscription(self, subscription_id: str,
293459 request : dict ) -> dict :
294460 """Update (edit) a Subscription via PATCH.
295461
296- Args
462+ Args:
297463 subscription_id (str): id of the subscription to update.
298464 request (dict): subscription content for update, only
299465 attributes to update are required.
0 commit comments