diff --git a/server/extension/sql/20_geocode_street.sql b/server/extension/sql/20_geocode_street.sql index b4fbcd1..ebe3207 100644 --- a/server/extension/sql/20_geocode_street.sql +++ b/server/extension/sql/20_geocode_street.sql @@ -88,7 +88,7 @@ RETURNS Geometry AS $$ raise Exception('You have reached the limit of your quota') try: - geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code, logger) + geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code, logger, user_geocoder_config.heremaps_service_params) coordinates = geocoder.geocode(searchtext=searchtext, city=city, state=state_province, country=country) if coordinates: quota_service.increment_success_service_use() diff --git a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py index a3eb805..afd4549 100644 --- a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py @@ -52,14 +52,17 @@ class HereMapsGeocoder(Traceable): 'strictlanguagemode' ] + ADDRESS_PARAMS - def __init__(self, app_id, app_code, logger, maxresults=DEFAULT_MAXRESULTS, - gen=DEFAULT_GEN, host=PRODUCTION_GEOCODE_JSON_URL): + def __init__(self, app_id, app_code, logger, service_params={}, maxresults=DEFAULT_MAXRESULTS): + service_params = service_params or {} self.app_id = app_id self.app_code = app_code self._logger = logger self.maxresults = maxresults - self.gen = gen - self.host = host + self.gen = service_params.get('gen', self.DEFAULT_GEN) + self.host = service_params.get('json_url', self.PRODUCTION_GEOCODE_JSON_URL) + self.connect_timeout = service_params.get('connect_timeout', self.CONNECT_TIMEOUT) + self.read_timeout = service_params.get('read_timeout', self.READ_TIMEOUT) + self.max_retries = service_params.get('max_retries', self.MAX_RETRIES) def geocode(self, **kwargs): params = {} @@ -92,9 +95,9 @@ class HereMapsGeocoder(Traceable): request_params.update(params) # TODO Extract HTTP client wrapper session = requests.Session() - session.mount(self.host, HTTPAdapter(max_retries=self.MAX_RETRIES)) + session.mount(self.host, HTTPAdapter(max_retries=self.max_retries)) response = session.get(self.host, params=request_params, - timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) + timeout=(self.connect_timeout, self.read_timeout)) self.add_response_data(response, self._logger) if response.status_code == requests.codes.ok: return json.loads(response.text) diff --git a/server/lib/python/cartodb_services/cartodb_services/metrics/config.py b/server/lib/python/cartodb_services/cartodb_services/metrics/config.py index 14638f3..4cc78d2 100644 --- a/server/lib/python/cartodb_services/cartodb_services/metrics/config.py +++ b/server/lib/python/cartodb_services/cartodb_services/metrics/config.py @@ -222,6 +222,7 @@ class IsolinesRoutingConfig(ServiceConfig): if self._isolines_provider == self.HEREMAPS_PROVIDER: self._heremaps_app_id = db_config.heremaps_isolines_app_id self._heremaps_app_code = db_config.heremaps_isolines_app_code + self._heremaps_service_params = db_config.heremaps_isolines_service_params elif self._isolines_provider == self.MAPZEN_PROVIDER: self._mapzen_matrix_api_key = self._db_config.mapzen_matrix_api_key @@ -256,6 +257,10 @@ class IsolinesRoutingConfig(ServiceConfig): def heremaps_app_code(self): return self._heremaps_app_code + @property + def heremaps_service_params(self): + return self._heremaps_service_params + @property def mapzen_matrix_api_key(self): return self._mapzen_matrix_api_key @@ -368,6 +373,7 @@ class GeocoderConfig(ServiceConfig): self._heremaps_app_id = db_config.heremaps_geocoder_app_id self._heremaps_app_code = db_config.heremaps_geocoder_app_code self._cost_per_hit = db_config.heremaps_geocoder_cost_per_hit + self._heremaps_service_params = db_config.heremaps_geocoder_service_params elif self._geocoder_provider == self.GOOGLE_GEOCODER: self._google_maps_api_key = filtered_config[self.GOOGLE_GEOCODER_API_KEY] self._google_maps_client_id = filtered_config[self.GOOGLE_GEOCODER_CLIENT_ID] @@ -428,6 +434,10 @@ class GeocoderConfig(ServiceConfig): def heremaps_app_code(self): return self._heremaps_app_code + @property + def heremaps_service_params(self): + return self._heremaps_service_params + @property def mapzen_api_key(self): return self._mapzen_api_key @@ -444,6 +454,9 @@ class GeocoderConfig(ServiceConfig): def provider(self): return self._geocoder_provider + @property + def service(self): + return self._service class ServicesDBConfig: @@ -480,8 +493,10 @@ class ServicesDBConfig: self._heremaps_geocoder_app_code = heremaps_conf['geocoder']['app_code'] self._heremaps_geocoder_cost_per_hit = heremaps_conf['geocoder'][ 'geocoder_cost_per_hit'] + self._heremaps_geocoder_service_params = heremaps_conf['geocoder'].get('service', {}) self._heremaps_isolines_app_id = heremaps_conf['isolines']['app_id'] self._heremaps_isolines_app_code = heremaps_conf['isolines']['app_code'] + self._heremaps_isolines_service_params = heremaps_conf['isolines'].get('service', {}) def _get_mapzen_config(self): mapzen_conf_json = self._get_conf('mapzen_conf') @@ -530,6 +545,10 @@ class ServicesDBConfig: def heremaps_isolines_app_code(self): return self._heremaps_isolines_app_code + @property + def heremaps_isolines_service_params(self): + return self._heremaps_isolines_service_params + @property def heremaps_geocoder_app_id(self): return self._heremaps_geocoder_app_id @@ -542,6 +561,10 @@ class ServicesDBConfig: def heremaps_geocoder_cost_per_hit(self): return self._heremaps_geocoder_cost_per_hit + @property + def heremaps_geocoder_service_params(self): + return self._heremaps_geocoder_service_params + @property def mapzen_matrix_api_key(self): return self._mapzen_matrix_api_key diff --git a/server/lib/python/cartodb_services/test/test_heremapsgeocoder.py b/server/lib/python/cartodb_services/test/test_heremapsgeocoder.py index c09d75b..daf813d 100644 --- a/server/lib/python/cartodb_services/test/test_heremapsgeocoder.py +++ b/server/lib/python/cartodb_services/test/test_heremapsgeocoder.py @@ -145,3 +145,17 @@ class HereMapsGeocoderTestCase(unittest.TestCase): searchtext='Calle amor de dios', city='Cordoba', country='España') + + def test_geocode_with_nonstandard_url(self, req_mock): + geocoder = HereMapsGeocoder(None, None, Mock(), { 'json_url': 'http://nonstandard_here_url' }) + req_mock.register_uri('GET', 'http://nonstandard_here_url', text=self.GOOD_RESPONSE) + response = geocoder.geocode( + searchtext='Calle amor de dios', + city='Cordoba', + country='España') + + self.assertEqual(response[0], -5.2794) + self.assertEqual(response[1], 37.70246) + + +