示例#1
0
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)
示例#2
0
    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,
            },
        )