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
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
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
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
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
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