"""Interface for the ows-product microservice.""" import time from flask import g from oto import response from owsrequest import request as requests from pricing import config from pricing.api import cache from pricing.constants import service_name from sentry_sdk import capture_message @cache.memoize(86400) def convert_to_orchard_territories(territories): """Convert territories to Orch_1_2016 standard. Args: territories ([string]): the territory codes to convert. Returns: [string]: list of Orch_1_2016 territory codes """ path = '/conversion/ISO_3166_1_2016/Orch_1_2016?territory_code_a2={0}'\ .format(','.join(territories)) return make_territories_request(path) @cache.memoize(86400) def convert_to_iso_territories(territories): """Convert territories to Orch_1_2016 standard. Args: territories ([string]): the territory codes to convert. Returns: [string]: list of Orch_1_2016 territory codes """ path = '/conversion/Orch_1_2016/ISO_3166_1_2016?territory_code_a2={0}'\ .format(','.join(territories)) return make_territories_request(path) @cache.memoize(86400) def complement_orchard_territories(territories): """Complement territories for Orch_1_2016 standard. Args: territories ([string]): the territory codes to complement. Returns: [string]: list world minus the passed in territories """ path = '/complement/Orch_1_2016?territory_code_a2={0}'\ .format(','.join(territories)) return make_territories_request(path) @cache.memoize(86400) def complement_iso_territories(territories): """Complement territories for ISO_3166_1_2016 standard. Args: territories ([string]): the territory codes to complement. Returns: [string]: list world minus the passed in territories """ path = '/complement/ISO_3166_1_2016?territory_code_a2={0}'\ .format(','.join(territories)) return make_territories_request(path) @cache.cached(timeout=86400, key_prefix='all_territories') def get_all_orchard_territories(): """Get all territories for Orch_1_2016 standard. Returns: [string]: list of all territories in the world """ path = '/territory/Orch_1_2016' return make_territories_request(path) @cache.cached(timeout=86400, key_prefix='all_iso_territories') def get_all_iso_territories(): """Get all territories for ISO_3166_1_2016 standard. Returns: [string]: list of all territories in the world """ path = '/territory/ISO_3166_1_2016' return make_territories_request(path) def make_territories_request(path, retries=0): """Make an actual request to ows-territories. Args: path ([string]): the path to request. Returns: Response: the result of the request """ if config.ENVIRONMENT != config.TEST_ENVIRONMENT: if getattr(g, 'performance_profile', None) is None: g.performance_profile = {} g.performance_profile[path] = { 'start_time': time.time() } territories_response = requests.get(service_name.OWS_TERRITORIES, path) if config.ENVIRONMENT != config.TEST_ENVIRONMENT: g.performance_profile[path]['duration'] = \ time.time() - g.performance_profile[path]['start_time'] if territories_response.status_code == 200: return response.Response(message=(territories_response.json())) else: if retries < 3: time.sleep(0.5) return make_territories_request(path, retries + 1) capture_message( 'error response code: {0} from ows-territories on path: {1}'. format(territories_response.status_code, path)) return response.Response(status=404)