From 98bf8df2978670379fe4ea904b489af03906c31d Mon Sep 17 00:00:00 2001 From: Vin Yam Date: Mon, 10 Jun 2019 12:38:56 -0700 Subject: [PATCH 1/9] fix pytaboola url order --- pytaboola/services/service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytaboola/services/service.py b/pytaboola/services/service.py index b01edc6..94b3588 100644 --- a/pytaboola/services/service.py +++ b/pytaboola/services/service.py @@ -34,8 +34,8 @@ def __init__(self, client, account_id, campaign_id): def build_uri(self, endpoint=None): base_endpoint = '{}/{}/campaigns/{}/items/'.format(self.endpoint, - self.campaign_id, - self.account_id) + self.account_id, + self.campaign_id) if not endpoint: return base_endpoint while endpoint.startswith('/'): From 6b04069eb451f5de787062ba16f4dfacac97fa97 Mon Sep 17 00:00:00 2001 From: David Ersek Date: Wed, 19 Jun 2019 15:37:22 -0700 Subject: [PATCH 2/9] feat(service): add AdvertiserService --- pytaboola/services/service.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pytaboola/services/service.py b/pytaboola/services/service.py index 94b3588..66e4c6f 100644 --- a/pytaboola/services/service.py +++ b/pytaboola/services/service.py @@ -4,6 +4,24 @@ logger = logging.getLogger(__name__) +class AdvertiserService(services.base.BaseService): + ''' + Only return advertisers under a container to handle + situations where account permissions overlap or + are shared across multiple users. + ''' + + def __init__(self, client, container_id): + super().__init__(client) + self.container_id = container_id + + def build_uri(self, endpoint=None): + return '{}/{}/advertisers'.format(self.endpoint, self.container_id) + + def list(self): + return self.execute('GET', self.build_uri()) + + class AccountService(BaseService): endpoint = '{}/{}'.format(BaseService.endpoint, 'users/current/allowed-accounts/') From 3a87e889bca93a41e25b9e987649fe1626677b3c Mon Sep 17 00:00:00 2001 From: David Ersek Date: Wed, 19 Jun 2019 15:40:53 -0700 Subject: [PATCH 3/9] fix(service): fix copypaste import bug --- pytaboola/services/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytaboola/services/service.py b/pytaboola/services/service.py index 66e4c6f..e05423b 100644 --- a/pytaboola/services/service.py +++ b/pytaboola/services/service.py @@ -4,7 +4,7 @@ logger = logging.getLogger(__name__) -class AdvertiserService(services.base.BaseService): +class AdvertiserService(BaseService): ''' Only return advertisers under a container to handle situations where account permissions overlap or From 36df1a1fe15c3b42681e3b06966762877ecd6862 Mon Sep 17 00:00:00 2001 From: jsu Date: Mon, 27 Apr 2020 12:43:51 -0700 Subject: [PATCH 4/9] Add timeout to TaboolaClient --- pytaboola/client.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pytaboola/client.py b/pytaboola/client.py index a8a3bc3..5c4d768 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -16,13 +16,19 @@ class TaboolaClient: base_url = 'https://backstage.taboola.com' def __init__(self, client_id, client_secret=None, - access_token=None, refresh_token=None): + access_token=None, refresh_token=None, + timeout=None): + """ + timeout (in seconds) will be passed to requests.request(). + If timeout is not set, then default to None. Which will wait forever. + """ assert client_secret or access_token, "Must provide either the client secret or an access token" self.access_token = access_token self.refresh_token = refresh_token self.client_id = client_id self.client_secret = client_secret + self.timeout = timeout if not self.access_token: self.refresh() @@ -98,7 +104,8 @@ def execute(self, method, uri, query_params=None, data = payload if raw else json.dumps(payload) result = requests.request(method, url, data=data, params=query_params, - headers=headers) + headers=headers, + timeout=self.timeout) return parse_response(result) except Unauthorized: if not allow_refresh: From abfb1b4ce8f3ae12d94de3b420bae7b2bcf15ac6 Mon Sep 17 00:00:00 2001 From: jsu Date: Mon, 27 Apr 2020 12:45:04 -0700 Subject: [PATCH 5/9] Revert "Add timeout to TaboolaClient" This reverts commit 36df1a1fe15c3b42681e3b06966762877ecd6862. --- pytaboola/client.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pytaboola/client.py b/pytaboola/client.py index 5c4d768..a8a3bc3 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -16,19 +16,13 @@ class TaboolaClient: base_url = 'https://backstage.taboola.com' def __init__(self, client_id, client_secret=None, - access_token=None, refresh_token=None, - timeout=None): - """ - timeout (in seconds) will be passed to requests.request(). - If timeout is not set, then default to None. Which will wait forever. - """ + access_token=None, refresh_token=None): assert client_secret or access_token, "Must provide either the client secret or an access token" self.access_token = access_token self.refresh_token = refresh_token self.client_id = client_id self.client_secret = client_secret - self.timeout = timeout if not self.access_token: self.refresh() @@ -104,8 +98,7 @@ def execute(self, method, uri, query_params=None, data = payload if raw else json.dumps(payload) result = requests.request(method, url, data=data, params=query_params, - headers=headers, - timeout=self.timeout) + headers=headers) return parse_response(result) except Unauthorized: if not allow_refresh: From 4688d18170e4cfa76a5270139ac544fa408b1b6a Mon Sep 17 00:00:00 2001 From: jsu Date: Mon, 27 Apr 2020 12:47:21 -0700 Subject: [PATCH 6/9] Add timeout to requests --- pytaboola/client.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pytaboola/client.py b/pytaboola/client.py index a8a3bc3..5c4d768 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -16,13 +16,19 @@ class TaboolaClient: base_url = 'https://backstage.taboola.com' def __init__(self, client_id, client_secret=None, - access_token=None, refresh_token=None): + access_token=None, refresh_token=None, + timeout=None): + """ + timeout (in seconds) will be passed to requests.request(). + If timeout is not set, then default to None. Which will wait forever. + """ assert client_secret or access_token, "Must provide either the client secret or an access token" self.access_token = access_token self.refresh_token = refresh_token self.client_id = client_id self.client_secret = client_secret + self.timeout = timeout if not self.access_token: self.refresh() @@ -98,7 +104,8 @@ def execute(self, method, uri, query_params=None, data = payload if raw else json.dumps(payload) result = requests.request(method, url, data=data, params=query_params, - headers=headers) + headers=headers, + timeout=self.timeout) return parse_response(result) except Unauthorized: if not allow_refresh: From 93214598901c14fa05ce11810ece2162e5251a33 Mon Sep 17 00:00:00 2001 From: jsu Date: Mon, 27 Apr 2020 16:16:02 -0700 Subject: [PATCH 7/9] add tenacity.retry --- pytaboola/client.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pytaboola/client.py b/pytaboola/client.py index 5c4d768..a2f314c 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -1,6 +1,7 @@ import json import logging import requests +import tenacity from pytaboola.errors import Unauthorized from pytaboola.utils import parse_response @@ -90,6 +91,12 @@ def authorization_header(self): def token_details(self): return self.execute('GET', 'backstage/api/1.0/token-details/') + @tenacity.retry( + stop=tenacity.stop_after_attempt(6), + wait=tenacity.wait_exponential(multiplier=1, exp_base=2), + retry=tenacity.retry_if_exception_type((ReadTimeout, ConnectTimeout)), + before_sleep=tenacity.before_sleep_log(logger, logging.INFO), + ) def execute(self, method, uri, query_params=None, allow_refresh=True, raw=False, authenticated=True, **payload): From 2c815ace03b6ce6d2a25f62194015e6def21789c Mon Sep 17 00:00:00 2001 From: jsu Date: Mon, 27 Apr 2020 16:27:30 -0700 Subject: [PATCH 8/9] add exceptions --- pytaboola/client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pytaboola/client.py b/pytaboola/client.py index a2f314c..bfcfa09 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -2,6 +2,7 @@ import logging import requests import tenacity +from requests.exceptions import ReadTimeout, ConnectTimeout from pytaboola.errors import Unauthorized from pytaboola.utils import parse_response From 1cb0f6f2dc23c30307c47f750452f4ef5f87ac64 Mon Sep 17 00:00:00 2001 From: jsu Date: Thu, 30 Jul 2020 13:21:54 -0700 Subject: [PATCH 9/9] Add ConnectionError to retry --- pytaboola/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytaboola/client.py b/pytaboola/client.py index bfcfa09..149ed2d 100644 --- a/pytaboola/client.py +++ b/pytaboola/client.py @@ -2,7 +2,7 @@ import logging import requests import tenacity -from requests.exceptions import ReadTimeout, ConnectTimeout +from requests.exceptions import ReadTimeout, ConnectTimeout, ConnectionError from pytaboola.errors import Unauthorized from pytaboola.utils import parse_response @@ -95,7 +95,7 @@ def token_details(self): @tenacity.retry( stop=tenacity.stop_after_attempt(6), wait=tenacity.wait_exponential(multiplier=1, exp_base=2), - retry=tenacity.retry_if_exception_type((ReadTimeout, ConnectTimeout)), + retry=tenacity.retry_if_exception_type((ReadTimeout, ConnectTimeout, ConnectionError)), before_sleep=tenacity.before_sleep_log(logger, logging.INFO), ) def execute(self, method, uri, query_params=None,