brian-yu-nexusflow commited on
Commit
d082a11
β€’
1 Parent(s): 24a8d18

Update tools.py

Browse files
Files changed (1) hide show
  1. tools.py +43 -43
tools.py CHANGED
@@ -25,12 +25,6 @@ class Tools:
25
  self.gmaps = Client(config.gmaps_client_key)
26
  self.client_ip: str | None = None
27
 
28
- def capitalize(self, s: str) -> str:
29
- if s.lower() != s:
30
- return s
31
-
32
- return s.title()
33
-
34
  def haversine(self, lon1, lat1, lon2, lat2) -> float:
35
  """
36
  Calculate the great circle distance in kilometers between two points on the earth (specified in decimal degrees).
@@ -98,13 +92,26 @@ class Tools:
98
 
99
  - location: This can be a city like 'Austin', or a place like 'Austin Airport', etc.
100
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
- # For response content, see https://developers.google.com/maps/documentation/geocoding/requests-geocoding#GeocodingResponses
103
- results = self.gmaps.geocode(location)
104
- location = self.capitalize(location)
105
- for r in results:
106
- r["name"] = location
107
- return results
108
 
109
  def get_distance(self, place_1: str, place_2: str):
110
  """
@@ -182,25 +189,28 @@ class Tools:
182
  - location (str): The location for the search. This can be a city's name, region, or anything that specifies the location.
183
  - radius_miles (int): Optional. The max distance from the described location to limit the search. Distance is specified in miles.
184
  """
185
- # Get latitude and longitude for the location
186
- verb_location = location
187
- geocode_result = self.gmaps.geocode(location)
188
- if geocode_result:
189
- latlong = geocode_result[0]["geometry"]["location"]
190
- location = (latlong["lat"], latlong["lng"])
191
- else:
192
  return []
 
 
 
193
 
194
  type_of_place = " ".join(type_of_place)
195
  # Perform the search using Google Places API
196
  # For response format, see https://developers.google.com/maps/documentation/places/web-service/search-nearby#nearby-search-responses
197
- places_result = self.gmaps.places_nearby(
198
- location=location, keyword=type_of_place, radius=radius_miles * 1609.34
 
 
199
  )
200
- places = places_result.get("results", [])
201
- new_places = []
202
- for place in places:
203
- place_location = place["geometry"]["location"]
 
 
 
204
  distance = self.haversine(
205
  latlong["lng"],
206
  latlong["lat"],
@@ -211,10 +221,9 @@ class Tools:
211
  continue
212
 
213
  distance = distance * 0.621371
214
- place["distance"] = f"{distance} miles from {verb_location}"
215
- new_places.append(place)
216
 
217
- places = new_places
218
  if len(places) == 0:
219
  return []
220
 
@@ -251,25 +260,16 @@ class Tools:
251
  elif isinstance(place_name, dict) and "name" in place_name:
252
  place_name = place_name["name"]
253
 
254
- # For response format, see https://developers.google.com/maps/documentation/places/web-service/search-find-place#find-place-responses
255
- search_results = self.gmaps.find_place(
256
- place_name, input_type="textquery", location_bias="ipbias"
257
- )
258
-
259
- if len(search_results.get("candidates", [])) == 0:
260
- return []
261
 
262
- # Assuming the first result is the most relevant
263
- place_id = search_results["candidates"][0]["place_id"]
264
- # For response format, see https://developers.google.com/maps/documentation/places/web-service/details#PlaceDetailsResponses
265
- place_details = self.gmaps.place(place_id=place_id)
266
- reviews = place_details["result"].get("reviews", [])
267
 
268
  for review in reviews:
269
  review["for_location"] = place_name
270
- review["formatted_address"] = place_details["result"][
271
- "formatted_address"
272
- ]
273
 
274
  all_reviews.extend(reviews)
275
 
 
25
  self.gmaps = Client(config.gmaps_client_key)
26
  self.client_ip: str | None = None
27
 
 
 
 
 
 
 
28
  def haversine(self, lon1, lat1, lon2, lat2) -> float:
29
  """
30
  Calculate the great circle distance in kilometers between two points on the earth (specified in decimal degrees).
 
92
 
93
  - location: This can be a city like 'Austin', or a place like 'Austin Airport', etc.
94
  """
95
+ if (
96
+ isinstance(location, list)
97
+ and len(location) != 0
98
+ and isinstance(location[0], dict)
99
+ ):
100
+ return location
101
+
102
+ # For response content, see https://developers.google.com/maps/documentation/places/web-service/search-find-place#find-place-responses
103
+ results = self.gmaps.find_place(
104
+ location, input_type="textquery", location_bias="ipbias"
105
+ )
106
+ if results["status"] != "OK":
107
+ return []
108
+
109
+ # We always use the first candidate
110
+ place_id = results["candidates"][0]["place_id"]
111
 
112
+ # For response format, see https://developers.google.com/maps/documentation/places/web-service/details#PlaceDetailsResponses
113
+ place_details = self.gmaps.place(place_id=place_id)["result"]
114
+ return [place_details]
 
 
 
115
 
116
  def get_distance(self, place_1: str, place_2: str):
117
  """
 
189
  - location (str): The location for the search. This can be a city's name, region, or anything that specifies the location.
190
  - radius_miles (int): Optional. The max distance from the described location to limit the search. Distance is specified in miles.
191
  """
192
+ place_details = self.get_latitude_longitude(location)
193
+ if len(place_details) == 0:
 
 
 
 
 
194
  return []
195
+ place_details = place_details[0]
196
+ location = place_details["name"]
197
+ latlong = place_details["geometry"]["location"]
198
 
199
  type_of_place = " ".join(type_of_place)
200
  # Perform the search using Google Places API
201
  # For response format, see https://developers.google.com/maps/documentation/places/web-service/search-nearby#nearby-search-responses
202
+ places_nearby = self.gmaps.places_nearby(
203
+ location=(latlong["lat"], latlong["lng"]),
204
+ keyword=type_of_place,
205
+ radius=radius_miles * 1609.34,
206
  )
207
+ if places_nearby["status"] != "OK":
208
+ return []
209
+
210
+ places_nearby = places_nearby["results"]
211
+ places = []
212
+ for place_nearby in places_nearby:
213
+ place_location = place_nearby["geometry"]["location"]
214
  distance = self.haversine(
215
  latlong["lng"],
216
  latlong["lat"],
 
221
  continue
222
 
223
  distance = distance * 0.621371
224
+ place_nearby["distance"] = f"{distance} miles from {location}"
225
+ places.append(place_nearby)
226
 
 
227
  if len(places) == 0:
228
  return []
229
 
 
260
  elif isinstance(place_name, dict) and "name" in place_name:
261
  place_name = place_name["name"]
262
 
263
+ place_details = self.get_latitude_longitude(place_name)
264
+ if len(place_details) == 0:
265
+ continue
266
+ place_details = place_details[0]
 
 
 
267
 
268
+ reviews = place_details.get("reviews", [])
 
 
 
 
269
 
270
  for review in reviews:
271
  review["for_location"] = place_name
272
+ review["formatted_address"] = place_details["formatted_address"]
 
 
273
 
274
  all_reviews.extend(reviews)
275