def clean(self, value): if not value: raise forms.ValidationError('Enter your location.') try: result = full_geocode(value) except Exception: raise forms.ValidationError("We're not familiar with this location. Could you please enter another one that we'd know, like a ZIP code, perhaps?") if result['ambiguous'] and result['type'] != 'block': raise forms.ValidationError("This location is ambiguous. Please enter one of the following: %s" % ', '.join([r['address'] for r in result['result']])) return value
def clean(self, value): if not value: raise forms.ValidationError('Enter your location.') try: result = full_geocode(value, search_places=False) except Exception: raise forms.ValidationError("We're not familiar with this location. Could you please enter another one that we'd know, like a ZIP code, perhaps?") if result['ambiguous'] and result['type'] != 'block': raise forms.ValidationError("This location is ambiguous. Please enter one of the following: %s" % ', '.join([r['address'] for r in result['result']])) return value
def _build_geocoder_results(query): results = full_geocode(query) if results['type'] == 'block': return [] if results['ambiguous'] == True: rs = results['result'] else: rs = [results['result']] return [_build_json_result(query, r, results) for r in rs]
def search(request, schema_slug=''): "Performs a location search and redirects to the address/xy page." # Check whether a schema was provided. if schema_slug: try: schema = get_schema_manager(request).get(slug=schema_slug) except Schema.DoesNotExist: raise Http404('Schema does not exist') url_prefix = schema.url()[:-1] else: schema = None url_prefix = '' # Get the query. q = request.GET.get('q', '').strip() if not q: return HttpResponseRedirect(url_prefix + '/') # TODO: Do something better than redirecting. # For /search/?type=alert, we redirect results to the alert page, not the # place page. if request.GET.get('type', '') == 'alert': url_method = 'alert_url' else: url_method = 'url' # Try to geocode it using full_geocode(). try: result = full_geocode(q, search_places=False) except: # TODO: Naked except clause. pass else: if result['ambiguous']: if result['type'] == 'block': return eb_render(request, 'db/search_invalid_block.html', { 'query': q, 'choices': result['result'], 'street_name': result['street_name'], 'block_number': result['block_number'] }) else: return eb_render(request, 'db/did_you_mean.html', {'query': q, 'choices': result['result']}) elif result['type'] == 'location': return HttpResponseRedirect(url_prefix + getattr(result['result'], url_method)()) elif result['type'] == 'address': # Block if result['result']['block']: return HttpResponseRedirect(url_prefix + getattr(result['result']['block'], url_method)()) # Intersection try: intersection = Intersection.objects.get(id=result['result']['intersection_id']) except Intersection.DoesNotExist: pass else: return HttpResponseRedirect(url_prefix + getattr(intersection, url_method)()) # Failing the geocoding, look in the special-case table. try: special_case = SearchSpecialCase.objects.get(query=normalize(q)) except SearchSpecialCase.DoesNotExist: pass else: if special_case.redirect_to: return HttpResponseRedirect(special_case.redirect_to) else: return eb_render(request, 'db/search_special_case.html', {'query': q, 'special_case': special_case}) # Failing that, display a list of ZIP codes if this looks like a ZIP. if re.search(r'^\s*\d{5}(?:-\d{4})?\s*$', q): z_list = Location.objects.filter(location_type__slug='zipcodes', is_public=True).select_related().order_by('name') if z_list: return eb_render(request, 'db/search_error_zip_list.html', {'query': q, 'zipcode_list': z_list}) # Failing all of that, display the search error page. lt_list = LocationType.objects.filter(is_significant=True).order_by('name') return eb_render(request, 'db/search_error.html', {'query': q, 'locationtype_list': lt_list})
def _geocode_geojson(query): if not query: return [] try: res = full_geocode(query) # normalize a bit if not res['ambiguous']: res['result'] = [res['result']] except DoesNotExist: return [] features = [] if res['type'] == 'location': for r in res['result']: feature = { 'type': 'Feature', 'geometry': simplejson.loads(r.location.centroid.geojson), 'properties': { 'type': r.location_type.slug, 'name': r.name, 'city': r.city, 'query': query, } } features.append(feature) elif res['type'] == 'place': for r in res['result']: feature = { 'type': 'Feature', 'geometry': simplejson.loads(r.location.geojson), 'properties': { 'type': 'place', 'name': r.pretty_name, 'address': r.address, 'query': query, } } features.append(feature) elif res['type'] == 'address': for r in res['result']: feature = { 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [r.lng, r.lat], }, 'properties': { 'type': 'address', 'address': r.get('address'), 'city': r.get('city'), 'state': r.get('state'), 'zip': r.get('zip'), 'query': query } } features.append(feature) # we could get type == 'block', but # ebpub.db.views.ajax_wkt returned nothing for this, # so for now we follow their lead. # elif res['type'] == 'block': # pass return features
def _geocode_geojson(query): if not query: return [] try: res = full_geocode(query) # normalize a bit if not res['ambiguous']: res['result'] = [res['result']] except DoesNotExist: return [] features = [] if res['type'] == 'location': for r in res['result']: feature = { 'type': 'Feature', 'geometry': simplejson.loads(r.centroid.geojson), 'properties': { 'type': r.location_type.slug, 'name': r.name, 'city': r.city, 'query': query, } } features.append(feature) elif res['type'] == 'place': for r in res['result']: feature = { 'type': 'Feature', 'geometry': simplejson.loads(r.location.geojson), 'properties': { 'type': 'place', 'name': r.pretty_name, 'address': r.address, 'query': query, } } features.append(feature) elif res['type'] == 'address': for r in res['result']: feature = { 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [r.lat, r.lng], }, 'properties': { 'type': 'address', 'address': r.get('address'), 'city': r.get('city'), 'state': r.get('state'), 'zip': r.get('zip'), 'query': query } } features.append(feature) # we could get type == 'block', but # ebpub.db.views returns nothing for this, # so for now we follow their lead. # elif res['type'] == 'block': # pass return features