def airports(): """Find closest airports.""" lat = float(request.args.get("lat")) lng = float(request.args.get("lng")) limit = int(request.args.get("limit")) or 1 find_closest_city = request.args.get("find_closest_city") == "true" redis_key = "|".join( ["airports", str(lat), str(lng), str(limit), str(find_closest_city)]) try: result = redis_store.get(redis_key) redis_is_connected = True if result: return jsonify(pickle.loads(result)) except RedisConnectionError: redis_is_connected = False result = {"airports": Airport.get_closest_airports(lat, lng, limit)} if find_closest_city: # Try to find with Elasticsearch. try: cities = es.search( index="airtickets-city-index", from_=0, size=1, doc_type="CityName", body={ "query": { "bool": { "must": { "geo_distance": { "distance": "500km", "location": { "lat": lat, "lon": lng }, } } } }, "sort": { "_geo_distance": { "location": { "lat": lat, "lon": lng }, "order": "asc", "unit": "km", } }, "size": 1, }, ) result["closest_city"] = cities["hits"]["hits"][0]["_source"] except (ElasticConnectionError, NotFoundError, AttributeError): result["closest_city"] = next( iter(City.get_closest_cities(lat, lng, 1) or []), None) if redis_is_connected: redis_store.set(redis_key, pickle.dumps(result), 86400) return jsonify(result)
def test_commands_import_cities(self): runner = app.test_cli_runner() result = runner.invoke(import_cities, ["--rows", "10"]) assert result.exit_code == 0 # Test City model. city = City.query.filter_by(gns_ufi=10735690).first() self.assertIsNotNone(city) # Test City get_closest_cities() method. closest_city = City.get_closest_cities(33, 68)[0] # Different version of postgres have different precision. self.assertAlmostEqual(closest_city.pop("distance"), 43.9950902428921) self.assertDictEqual( closest_city, { "id": 1, "country_code": "AF", "data": {"lat": 33.175678, "lng": 68.730449}, "population": 0, "value": "شرن", }, ) # Test City serialize() method. self.assertDictEqual( city.serialize(), { "city_names": ["شرن", "Sharan"], "country_code": "AF", "gns_fd": "PPLA", "gns_ufi": 10735690, "id": 1, "language_code": "ps", "latitude": 33.175678, "longitude": 68.730449, "population": 0, "subdivision_code": "29", }, ) # Test CityName model. city_name = CityName.query.filter_by( name="Sharan", lang="latin", city_id=city.id ).first() assert city_name # Test CityName serialize() method. self.assertDictEqual( city_name.serialize(), {"name": "Sharan", "city_id": city.id} ) # Test CityName autocomplete_serialize() method. expected = { "value": "Sharan", "data": {"id": 1, "lng": 68.730449, "lat": 33.175678, "country_code": "AF"}, } self.assertDictEqual(city_name.autocomplete_serialize(), expected) # Test CityName elastic_serialize() method. expected.update( {"location": {"lat": 33.175678, "lon": 68.730449}, "population": 0} ) self.assertDictEqual( city_name.elastic_serialize(), { "_index": "airtickets-city-index", "_type": "CityName", "_id": 1, "_source": expected, }, )