def locQuery(location, **kwargs): """ Function to return matching locations. Can be optimized in 2 manners: 1) Get rid of for loops on WaterBody and BaseLocation querysets 2) Optimize locDetermine() """ q = GoogleLatLng() query = GuideCore.objects.none() loc, type = locDetermine(location) if not type: if q.requestLatLngJSON(location): loc, type = q, q.results['types'] newloc = BaseLocation() try: newloc.save(mquery=q) except: pass elif q.requestLatLngJSON(location, True): loc, type = q, q.results['types'] newloc = WaterBody() try: newloc.save(mquery=q) except: pass if newloc.id: newloc.associate_locations() else: return query rad = kwargs.get('radius', 100) if 'country' in type: # If it was a search by Country name try: l = loc.results['address_components'][0]['short_name'] except: l = loc.country.abbr query = GuideCore.objects.filter(Q(locations__country__abbr=l)) elif 'administrative_area_level_1' in type: # If it was a search by a state name try: l = loc.results['address_components'][0]['short_name'] except: l = loc.state.key query = GuideCore.objects.filter(Q(locations__state__key=l)) else: # If is was a search by a city name or a WaterBody locs = BaseLocation.neighbours.nearby_locations(loc.lat, loc.lng, rad, True).select_related('FishingGuides') for l in locs: query = query | GuideCore.objects.filter(locations=l) locs = WaterBody.neighbours.nearby_locations(loc.lat, loc.lng, rad, True).select_related('Operators') for w in locs: query = query | GuideCore.objects.filter(waterbodies=w) return query
def locQuery(location, **kwargs): """ Function to return matching locations. Can be optimized in 2 manners: 1) Get rid of for loops on WaterBody and BaseLocation querysets 2) Optimize locDetermine() """ q = GoogleLatLng() query = GuideCore.objects.none() loc, type = locDetermine(location) print "\nOutput of locDetermine:\n", (loc, type) if not type: if q.requestLatLngJSON(location): loc, type = q, q.results['types'] newloc = BaseLocation() newloc.save(mquery=q) print "\nSaved a land location\n" elif q.requestLatLngJSON(location, True): loc, type = q, q.results['types'] newloc = WaterBody() newloc.save(mquery=q) if newloc.id: newloc.associate_locations() print "\nSaved a water location\n" else: return query rad = kwargs.get('radius', 100) if 'country' in type: # If it was a search by Country name query = GuideCore.objects.filter(Q(locations__country__abbr__icontains=location) | Q(locations__country__name__icontains=location)) elif 'administrative_area_level_1' in type: # If it was a search by a state name l = location.split(',')[0] query = GuideCore.objects.filter(Q(locations__state__key__icontains=l) | Q(locations__state__name__icontains=l)) else: # If is was a search by a city name or a WaterBody locs = BaseLocation.neighbours.nearby_locations(loc.lat, loc.lng, rad, True).select_related('FishingGuides') for l in locs: query = query | GuideCore.objects.filter(locations=l) locs = WaterBody.neighbours.nearby_locations(loc.lat, loc.lng, rad, True).select_related('Operators') for w in locs: query = query | GuideCore.objects.filter(waterbodies=w) print "\nOutput of locQuery:\n", query.distinct() return query