def clean(self): if not self.place: geocode_result = Place.geocode_raw_address(self.raw_address) filtered_results = list( result for result in geocode_result if not set(result['types']).isdisjoint( settings.GMAPS_ALLOWED_LOCATION_TYPES ) ) if len(filtered_results) == 0: raise ValidationError( { "raw_address": _( "There are no results when geocoding '{raw_address}' with the " "allowed types".format(raw_address=self.raw_address) ) } ) elif len(filtered_results) != 1: raise ValidationError( { "raw_address": _( "There is more than one result when geocoding '{raw_address}' with the " "allowed types, be more specific".format(raw_address=self.raw_address) ) } ) geocoded_place = filtered_results[0] google_place_id = geocoded_place['place_id'] place, created = Place.objects.get_or_create_from_place_id(google_place_id) self.place = place self.formatted_address = self.place.formatted_address
def get_or_create_from_raw_address( self, raw_address, allowed_types=settings.GMAPS_ALLOWED_LOCATION_TYPES, defaults=None, **kwargs): from places.models import Place geocode_result = Place.geocode_raw_address(raw_address) filtered_results = list( result for result in geocode_result if not set(result['types']).isdisjoint(allowed_types)) if len(filtered_results) == 0: raise ValueError( _("There are no results when geocoding '{raw_address}' with the " "allowed types '{types}'".format( raw_address=raw_address, types=", ".join(allowed_types)))) geocoded_place = filtered_results[0] google_place_id = geocoded_place['place_id'] defaults = Place.get_defaults_from_geocoded_place( geocoded_place, defaults) place, created = self.get_or_create(google_place_id=google_place_id, defaults=defaults, **kwargs) return (place, created)