"""Logic for polling Deezer store.""" from retrying import retry from availability import datastructures as ds from availability import exceptions from availability.connectors.stores import deezer from availability.constants import error from availability.constants import models from availability.constants import stores def retry_if_rate_limit_exceeded(exception): """Retry if exception is RateLimitExceeded instance.""" return isinstance(exception, exceptions.RateLimitExceeded) @retry( stop_max_attempt_number=stores.DEEZER_RETRIES_NUM, wait_fixed=stores.DEEZER_SLEEP_SECONDS * 1000, retry_on_exception=retry_if_rate_limit_exceeded) def get_status_from_store(*, upc, **kwargs): """Get status from Deezer store. Args: upc (str): Universal Product Code. Returns: ReleaseStatus: object with data parsed from store response. Raises: StoreResponseParseError: Deezer returned response with bad content. """ store_response = deezer.query_store(upc) if 'error' in store_response: release_status = process_error_response(upc, store_response) else: release_status = process_valid_response(store_response) return release_status def process_valid_response(store_response): """Process valid response from Deezer store. Args: store_response (dict): All required data to create ReleaseStatus. Returns: ReleaseStatus: structure with release id and status in Deezer store. """ release_status = ds.ReleaseStatus() release_status.store_release_id = str(store_response['id']) if store_response.get('available') is True: release_status.db_release_status = models.RELEASE_STATUS_LIVE else: release_status.db_release_status = models.RELEASE_STATUS_DELIVERED return release_status def process_error_response(upc, store_response): """Process error response from Deezer and act accordingly to each error. Args: upc (str): Universal Product Code. store_response (dict): Error response from Deezer. Raises: StoreRequestError: store returned response with error. RateLimitExceeded: store returned response with 'Quota exceeded' error. This error is used by @retry decorator to make several more attempts to get data from Deezer. """ error_code = store_response.get('error').get('code') if error_code == error.DEEZER_RELEASE_NOT_FOUND_CODE: return ds.ReleaseStatus( db_release_status=models.RELEASE_STATUS_DELIVERED) elif error_code == error.DEEZER_QUOTA_EXCEEDED_ERROR_CODE: raise exceptions.RateLimitExceeded(upc) raise exceptions.StoreRequestError( 'upc {0} caused bad response {1}'.format(upc, store_response))