def _parse_json(self, doc, exactly_one): """ Parse JSON response body. """ places = doc.get('geonames', []) err = doc.get('status', None) if err and 'message' in err: if err['message'].startswith("user account not enabled to use"): raise GeocoderInsufficientPrivileges(err['message']) else: raise GeocoderServiceError(err['message']) if not len(places): return None def parse_code(place): """ Parse each record. """ latitude = place.get('lat', None) longitude = place.get('lng', None) if latitude and longitude: latitude = float(latitude) longitude = float(longitude) else: return None placename = place.get('name') state = place.get('adminCode1', None) country = place.get('countryCode', None) location = ', '.join([x for x in [placename, state, country] if x]) return Location(location, (latitude, longitude), place) if exactly_one: return parse_code(places[0]) else: return [parse_code(place) for place in places]
def _parse_json(self,doc, userlocation,exactly_one=True): # pylint: disable=W0221 """ Parse a location name, latitude, and longitude from an JSON response. """ self.temparray = [] status_code = doc.get("statusCode", 200) if status_code != 200: err = doc.get("errorDetails", "") if status_code == 401: raise GeocoderAuthenticationFailure(err) elif status_code == 403: raise GeocoderInsufficientPrivileges(err) elif status_code == 429: raise GeocoderQuotaExceeded(err) elif status_code == 503: raise GeocoderUnavailable(err) else: raise GeocoderServiceError(err) resources = doc['resourceSets'][0]['resources'] if resources is None or not len(resources): return None def parse_resource(resource): """ Parse each return object. """ stripchars = ", \n" addr = resource['address'] address = addr.get('addressLine', '').strip(stripchars) city = addr.get('locality', '').strip(stripchars) state = addr.get('adminDistrict', '').strip(stripchars) zipcode = addr.get('postalCode', '').strip(stripchars) country = addr.get('countryRegion', '').strip(stripchars) city_state = join_filter(", ", [city, state]) place = join_filter(" ", [city_state, zipcode]) location = join_filter(", ", [address, place, country]) latitude = resource['point']['coordinates'][0] or None longitude = resource['point']['coordinates'][1] or None if latitude and longitude: latitude = float(latitude) longitude = float(longitude) return Location(location, (latitude, longitude), resource) if userlocation is None: if exactly_one: return parse_resource(resources[0]) else: return [parse_resource(resource) for resource in resources] else: for resource in resources: self.temparray.append(parse_resource(resource)) resultplace = Calculation.calculations(userlocation,self.temparray) if exactly_one: return resultplace[0] else: return resultplace