diff --git a/NEWS.md b/NEWS.md index 8db3f08..643222d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +February 5th, 2018 +================== +* Version `0.16.5` of the python library + * Fix displaced routing shape #443 + * Check for empty coordinates object before converting it to polygon + * 422 errors that come from Mapbox now returns an empty result because is a bad input from the user data + February 2th, 2018 ================== * Version `0.16.4` of the python library diff --git a/README.md b/README.md index 00514f9..e5b0d32 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Steps to deploy a new Data Services API version : ```sql CREATE DATABASE dataservices_db ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8'; - CREATE USER dataservices_user; + CREATE USER geocoder_api; ``` - Install needed extensions in `dataservices_db` database @@ -90,19 +90,23 @@ Steps to deploy a new Data Services API version : ``` psql -U postgres -d dataservices_db -f src/pg/test/fixtures/load_fixtures.sql ``` - - Give permission to execute and select to the `dataservices_user` user: + - Give permission to execute and select to the `geocoder_api` user: ``` psql -U postgres -d dataservices_db -c "BEGIN;CREATE EXTENSION IF NOT EXISTS observatory VERSION 'dev'; COMMIT" -e - psql -U postgres -d dataservices_db -c "BEGIN;GRANT SELECT ON ALL TABLES IN SCHEMA cdb_observatory TO dataservices_user; COMMIT" -e - psql -U postgres -d dataservices_db -c "BEGIN;GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_observatory TO dataservices_user; COMMIT" -e - psql -U postgres -d dataservices_db -c "BEGIN;GRANT SELECT ON ALL TABLES IN SCHEMA observatory TO dataservices_user; COMMIT" -e - psql -U postgres -d dataservices_db -c "BEGIN;GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA observatory TO dataservices_user; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT SELECT ON ALL TABLES IN SCHEMA cdb_observatory TO geocoder_api; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_observatory TO geocoder_api; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT USAGE ON SCHEMA cdb_observatory TO geocoder_api; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT SELECT ON ALL TABLES IN SCHEMA observatory TO geocoder_api; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA observatory TO geocoder_api; COMMIT" -e + psql -U postgres -d dataservices_db -c "BEGIN;GRANT USAGE ON SCHEMA observatory TO geocoder_api; COMMIT" -e ``` ### Server configuration Configuration for the different services must be stored in the server database using `CDB_Conf_SetConf()`. +**All the configuration inside brackets [] is optional** + #### Redis configuration If sentinel is used: diff --git a/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py index ceba105..8d7cacb 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py @@ -80,6 +80,8 @@ class MapboxGeocoder(Traceable): return self._parse_geocoder_response(response.text) elif response.status_code == requests.codes.bad_request: return [] + elif response.status_code == requests.codes.unprocessable_entity: + return [] else: raise ServiceException(response.status_code, response) except requests.Timeout as te: diff --git a/server/lib/python/cartodb_services/cartodb_services/mapbox/isolines.py b/server/lib/python/cartodb_services/cartodb_services/mapbox/isolines.py index 10c4209..e7f06c1 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapbox/isolines.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapbox/isolines.py @@ -49,6 +49,8 @@ class MapboxIsolines(): response = self._matrix_client.matrix([origin] + targets, profile) json_response = json.loads(response) + if not json_response: + return [] costs = [None] * number_of_angles @@ -125,6 +127,9 @@ class MapboxIsolines(): unit_factor=unit_factor, number_of_angles=number_of_angles) + if not costs: + continue + errors = [(cost - isorange) / float(isorange) for cost in costs] max_abs_error = max([abs(e) for e in errors]) if max_abs_error <= tolerance: diff --git a/server/lib/python/cartodb_services/cartodb_services/mapbox/matrix_client.py b/server/lib/python/cartodb_services/cartodb_services/mapbox/matrix_client.py index dfe0bde..8d547b6 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapbox/matrix_client.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapbox/matrix_client.py @@ -72,6 +72,8 @@ class MapboxMatrixClient(Traceable): return response.text elif response.status_code == requests.codes.bad_request: return '{}' + elif response.status_code == requests.codes.unprocessable_entity: + return '{}' else: raise ServiceException(response.status_code, response) except requests.Timeout as te: diff --git a/server/lib/python/cartodb_services/cartodb_services/mapbox/routing.py b/server/lib/python/cartodb_services/cartodb_services/mapbox/routing.py index e0827ca..3f30268 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapbox/routing.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapbox/routing.py @@ -91,6 +91,8 @@ class MapboxRouting(Traceable): return self._parse_routing_response(response.text) elif response.status_code == requests.codes.bad_request: return MapboxRoutingResponse(None, None, None) + elif response.status_code == requests.codes.unprocessable_entity: + return MapboxRoutingResponse(None, None, None) else: raise ServiceException(response.status_code, response) except requests.Timeout as te: diff --git a/server/lib/python/cartodb_services/cartodb_services/tools/coordinates.py b/server/lib/python/cartodb_services/cartodb_services/tools/coordinates.py index 935dba0..b02e801 100644 --- a/server/lib/python/cartodb_services/cartodb_services/tools/coordinates.py +++ b/server/lib/python/cartodb_services/cartodb_services/tools/coordinates.py @@ -45,6 +45,8 @@ def marshall_coordinates(coordinates): def coordinates_to_polygon(coordinates): """Convert a Coordinate array coordinates to a PostGIS polygon""" + if not coordinates: + return None coordinates.append(coordinates[0]) # Close the ring result_coordinates = [] for coordinate in coordinates: diff --git a/server/lib/python/cartodb_services/cartodb_services/tools/polyline.py b/server/lib/python/cartodb_services/cartodb_services/tools/polyline.py index eaca5f2..14bba19 100644 --- a/server/lib/python/cartodb_services/cartodb_services/tools/polyline.py +++ b/server/lib/python/cartodb_services/cartodb_services/tools/polyline.py @@ -51,9 +51,7 @@ def polyline_to_linestring(polyline): """Convert a Mapzen polyline shape to a PostGIS linestring""" coordinates = [] for point in polyline: - # Divide by 10 because mapzen uses one more decimal than the - # google standard (https://mapzen.com/documentation/turn-by-turn/decoding/) - coordinates.append("%s %s" % (point[1]/10, point[0]/10)) + coordinates.append("%s %s" % (point[1], point[0])) wkt_coordinates = ','.join(coordinates) try: diff --git a/server/lib/python/cartodb_services/setup.py b/server/lib/python/cartodb_services/setup.py index d38b15b..52144b9 100644 --- a/server/lib/python/cartodb_services/setup.py +++ b/server/lib/python/cartodb_services/setup.py @@ -10,7 +10,7 @@ from setuptools import setup, find_packages setup( name='cartodb_services', - version='0.16.4', + version='0.16.5', description='CartoDB Services API Python Library',