Exemplo n.º 1
0
def geocode(str, max_size=DEFAULT_RESULT_MAX_SIZE, add_geohash=True, resolve_to_ids=False, constrain_to_city=None):
    """
    default geocoder
    """
    from common.models import City, Country

    results = telmap_geocode(str, max_size, constrain_to_city)
    logging.info(u"geocoding results for %s: %s\n" % (str, results))

    if add_geohash or resolve_to_ids:
        for result in results:
            if add_geohash:
                result["geohash"] = geohash_encode(result["lon"], result["lat"])

            if resolve_to_ids:
                result["country"] = Country.get_id_by_code(result["country"])

                if is_in_hebrew(result["city"]):
                    result["city"] = City.get_id_by_name_and_country(
                        result["city"], result["country"], add_if_not_found=True
                    )
                else:
                    # try to reverse geocode to get city name in Hebrew
                    reverse_geocode_result = reverse_geocode(result["lat"], result["lon"])
                    if reverse_geocode_result:
                        result["city"] = reverse_geocode_result["city"]
                    else:
                        logging.error("failed to get Hebrew city name from reverse geocode")
                        result["city"] = City.get_id_by_name_and_country(
                            result["city"], result["country"], add_if_not_found=True
                        )

    return results
Exemplo n.º 2
0
    def create(self, request, *args, **kwargs):
        api_user = kwargs["api_user"]
        request_data = request.data.get("request")
        if not request_data:
            return rc.BAD_REQUEST

        language_code = request_data.get("language_code")
        translation.activate(language_code)

        passenger = None
        phone_number = request_data.get("phone_number")
        login_token = request_data.get("login_token")

        try:
            if login_token: #TODO_WB: merge needed to make this work
                passenger = Passenger.objects.get(login_token=login_token)
            elif phone_number and not api_user.phone_validation_required:
                passenger = Passenger.objects.get(phone=phone_number) 
        except Passenger.DoesNotExist:
            pass

        if not passenger:
            return rc.NOT_FOUND #TODO_WB: is this the right response

        order_data = {}
        for address_type in ('from', 'to'):
            for att, val in request_data[address_type].items():
                order_data[address_type + "_" + att] = val or ""

            if not is_valid_address(order_data, address_type):
                res = rc.BAD_REQUEST
                res.write(" %s\n" % ErrorCodes.INVALID_ADDRESS)
                return res

            order_data[address_type + "_country"] = Country.get_id_by_code(order_data[address_type + "_country"])
            order_data[address_type + "_city"] = City.get_id_by_name_and_country(order_data[address_type + "_city"], order_data[address_type + "_country"], add_if_not_found=True)

        order_form = OrderForm(data=order_data, passenger=passenger)
        if order_form.is_valid():

            order = order_form.save()
            order.api_user = api_user
            order.passenger = passenger
            order.language_code = language_code
            order.save()
            book_order_async(order)
            log_event(EventType.ORDER_BOOKED, order=order)
            return rc.CREATED
        else:
            response = rc.BAD_REQUEST
            response.write(" %s\n" % order_form.errors.as_text())
            return response
Exemplo n.º 3
0
def reverse_geocode(latitude, longitude):
    from common.models import Country, City

    result = telmap_reverse_geocode(latitude, longitude)
    if result:
        house_number = result.get("house_number")
        if not house_number or not house_number.isdigit():
            return None

        result["country_name"] = result["country"]
        result["country"] = Country.get_id_by_code(result["country"])
        result["city_name"] = result["city"]
        result["city"] = City.get_id_by_name_and_country(result["city"], result["country"], add_if_not_found=True)
        result["geohash"] = geohash_encode(longitude, latitude)

    return result
Exemplo n.º 4
0
def reverse_geocode(latitude, longitude):
    from common.models import Country, City

    result = telmap_reverse_geocode(latitude, longitude)
    if result:
        house_number = result.get("house_number")
        if not house_number or not house_number.isdigit():
            return None

        result["country_name"] = result["country"]
        result["country"] = Country.get_id_by_code(result["country"])
        result["city_name"] = result["city"]
        result["city"] = City.get_id_by_name_and_country(result["city"],
                                                         result["country"],
                                                         add_if_not_found=True)
        result["geohash"] = geohash_encode(longitude, latitude)

    return result
Exemplo n.º 5
0
def is_phone_registered(local_phone):
    """
    checks if the given phone already registered (belongs to a registered user)
    """
    phone_registered = False

    passengers = Passenger.objects.filter(phone=local_phone).filter(country=Country.get_id_by_code("IL"))
    if passengers.count() > 0:
        try:
            user = passengers[0].user
        except User.DoesNotExist:
            user = None

        phone_registered = user is not None
    else:
        phone_registered = False

    return phone_registered
Exemplo n.º 6
0
def geocode(str,
            max_size=DEFAULT_RESULT_MAX_SIZE,
            add_geohash=True,
            resolve_to_ids=False,
            constrain_to_city=None):
    """
    default geocoder
    """
    from common.models import City, Country

    results = telmap_geocode(str, max_size, constrain_to_city)
    logging.info(u"geocoding results for %s: %s\n" % (str, results))

    if add_geohash or resolve_to_ids:
        for result in results:
            if add_geohash:
                result["geohash"] = geohash_encode(result["lon"],
                                                   result["lat"])

            if resolve_to_ids:
                result["country"] = Country.get_id_by_code(result["country"])

                if is_in_hebrew(result["city"]):
                    result["city"] = City.get_id_by_name_and_country(
                        result["city"],
                        result["country"],
                        add_if_not_found=True)
                else:
                    # try to reverse geocode to get city name in Hebrew
                    reverse_geocode_result = reverse_geocode(
                        result["lat"], result["lon"])
                    if reverse_geocode_result:
                        result["city"] = reverse_geocode_result["city"]
                    else:
                        logging.error(
                            "failed to get Hebrew city name from reverse geocode"
                        )
                        result["city"] = City.get_id_by_name_and_country(
                            result["city"],
                            result["country"],
                            add_if_not_found=True)

    return results
Exemplo n.º 7
0
def is_phone_registered(local_phone):
    """
    checks if the given phone already registered (belongs to a registered user)
    """
    phone_registered = False

    passengers = Passenger.objects.filter(phone=local_phone).filter(
        country=Country.get_id_by_code("IL"))
    if passengers.count() > 0:
        try:
            user = passengers[0].user
        except User.DoesNotExist:
            user = None

        phone_registered = user is not None
    else:
        phone_registered = False

    return phone_registered