def instances_closest_to_point(request, lat, lng): """ Get all the info we need about instances near a given point Includes only public instances the user does not belong to. If a user has been specified instances that user belongs to will also be included in a separate list. Unlike instance_info, this does not return the field permissions for the instance """ user = request.user user_instance_ids = [] if user and not user.is_anonymous(): user_instance_ids = InstanceUser.objects.filter(user=user)\ .values_list('instance_id', flat=True)\ .distinct() point = Point(float(lng), float(lat), srid=4326) try: max_instances = int(request.GET.get('max', '10')) if not (1 <= max_instances <= 500): raise ValueError() except ValueError: raise HttpBadRequestException( 'The max parameter must be a number between 1 and 500') try: distance = float( request.GET.get('distance', settings.NEARBY_INSTANCE_RADIUS)) except ValueError: raise HttpBadRequestException( 'The distance parameter must be a number') instances = Instance.objects \ .filter(get_mobile_instances_filter()) \ .distance(point) \ .order_by('distance') nearby_predicate = Q(bounds__distance_lte=(point, D(m=distance))) personal_predicate = Q(pk__in=user_instance_ids) return { 'nearby': _contextify_instances( instances.filter(is_public=True).filter(nearby_predicate).exclude( personal_predicate)[0:max_instances]), 'personal': _contextify_instances(instances.filter(personal_predicate)) }
def instances_closest_to_point(request, lat, lng): """ Get all the info we need about instances near a given point Includes only public instances the user does not belong to. If a user has been specified instances that user belongs to will also be included in a separate list. Unlike instance_info, this does not return the field permissions for the instance """ user = request.user user_instance_ids = [] if user and not user.is_anonymous(): user_instance_ids = InstanceUser.objects.filter(user=user)\ .values_list('instance_id', flat=True)\ .distinct() point = Point(float(lng), float(lat), srid=4326) try: max_instances = int(request.GET.get('max', '10')) if not (1 <= max_instances <= 500): raise ValueError() except ValueError: raise HttpBadRequestException( 'The max parameter must be a number between 1 and 500') try: distance = float(request.GET.get( 'distance', settings.NEARBY_INSTANCE_RADIUS)) except ValueError: raise HttpBadRequestException( 'The distance parameter must be a number') instances = Instance.objects \ .filter(get_mobile_instances_filter()) \ .distance(point) \ .order_by('distance') nearby_predicate = Q(bounds__distance_lte=(point, D(m=distance))) personal_predicate = Q(pk__in=user_instance_ids) return { 'nearby': _contextify_instances(instances .filter(is_public=True) .filter(nearby_predicate) .exclude(personal_predicate) [0:max_instances]), 'personal': _contextify_instances(instances.filter(personal_predicate)) }
def public_instances(request): return _contextify_instances( Instance.objects.filter(is_public=True).filter( get_mobile_instances_filter()))
def public_instances(request): return _contextify_instances(Instance.objects .filter(is_public=True) .filter(get_mobile_instances_filter()))