def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if isinstance(area, HttpResponse): return area if not area.polygons.count(): return output_error(format, 'No polygons found', 404) generation = Generation.objects.current() args = { 'generation_low__lte': generation, 'generation_high__gte': generation, } type = request.REQUEST.get('type', '') if ',' in type: args['type__code__in'] = type.split(',') elif type: args['type__code'] = type elif area.type.code in ('EUR'): args['type__code'] = area.type.code set_timeout(format) try: areas = list(Area.objects.intersect(query_type, area).filter(**args).distinct()) areas = add_codes(areas) except QueryCanceledError: return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500) except DatabaseError, e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if 'canceling statement due to statement timeout' not in e.args[0]: raise return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
def nearest(request, srid, x, y, format='json'): location = Point(float(x), float(y), srid=int(srid)) set_timeout(format) try: postcode = Postcode.objects.filter( location__distance_gte=(location, D(mi=0))).distance(location).order_by('distance')[0] except QueryCanceledError: raise ViewException(format, 'That query was taking too long to compute.', 500) except DatabaseError as e: if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: raise ViewException(format, 'No postcode found near %s,%s (%s)' % (x, y, srid), 404) if format == 'html': return render(request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'json_view': 'mapit.views.postcodes.postcode', }) pc = postcode.as_dict() pc['distance'] = round(postcode.distance.m) return output_json({ 'postcode': pc, })
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if not area.polygons.count(): raise ViewException(format, 'No polygons found', 404) generation = Generation.objects.current() types = filter(None, request.REQUEST.get('type', '').split(',')) set_timeout(format) try: # Cast to list so that it's evaluated here, and add_codes doesn't get # confused with a RawQuerySet areas = list( Area.objects.intersect(query_type, area, types, generation)) areas = add_codes(areas) except QueryCanceledError: raise ViewException( format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500) except DatabaseError, e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException( format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if not area.polygons.count(): raise ViewException(format, _('No polygons found'), 404) generation = Generation.objects.current() types = [_f for _f in request.GET.get('type', '').split(',') if _f] set_timeout(format) try: # Cast to list so that it's evaluated here, and output_areas doesn't get # confused with a RawQuerySet areas = list( Area.objects.intersect(query_type, area, types, generation)) except DatabaseError as e: if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException( format, _('That query was taking too long to compute - ' 'try restricting to a specific type, if you weren\'t already doing so.' ), 500) except InternalError: raise ViewException( format, _('There was an internal error performing that query.'), 500) title = title % ('<a href="%sarea/%d.html">%s</a>' % (reverse('mapit_index'), area.id, area.name)) return output_areas(request, title, format, areas, norobots=True)
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if not area.polygons.count(): raise ViewException(format, 'No polygons found', 404) generation = Generation.objects.current() types = [_f for _f in request.REQUEST.get('type', '').split(',') if _f] set_timeout(format) try: # Cast to list so that it's evaluated here, and output_areas doesn't get # confused with a RawQuerySet areas = list(Area.objects.intersect(query_type, area, types, generation)) except QueryCanceledError: raise ViewException( format, 'That query was taking too long to compute - ' 'try restricting to a specific type, if you weren\'t already doing so.', 500) except DatabaseError as e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException( format, 'That query was taking too long to compute - ' 'try restricting to a specific type, if you weren\'t already doing so.', 500) except InternalError: raise ViewException(format, 'There was an internal error performing that query.', 500) title = title % ('<a href="%sarea/%d.html">%s</a>' % (reverse('mapit_index'), area.id, area.name)) return output_areas(request, title, format, areas, norobots=True)
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if not area.polygons.count(): raise ViewException(format, "No polygons found", 404) generation = Generation.objects.current() types = filter(None, request.REQUEST.get("type", "").split(",")) set_timeout(format) try: # Cast to list so that it's evaluated here, and add_codes doesn't get # confused with a RawQuerySet areas = list(Area.objects.intersect(query_type, area, types, generation)) areas = add_codes(areas) except QueryCanceledError: raise ViewException( format, "That query was taking too long to compute - try restricting to a specific type, if you weren't already doing so.", 500, ) except DatabaseError, e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if "canceling statement due to statement timeout" not in e.args[0]: raise raise ViewException( format, "That query was taking too long to compute - try restricting to a specific type, if you weren't already doing so.", 500, )
def nearest(request, srid, x, y, format='json'): location = Point(float(x), float(y), srid=int(srid)) set_timeout(format) try: postcode = Postcode.objects.filter( location__distance_gte=(location, D( mi=0))).distance(location).order_by('distance')[0] except DatabaseError as e: if 'Cannot find SRID' in e.args[0]: raise ViewException(format, e.args[0], 400) if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: raise ViewException(format, 'No postcode found near %s,%s (%s)' % (x, y, srid), 404) if format == 'html': return render(request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'json_view': 'mapit-postcode', }) pc = postcode.as_dict() pc['distance'] = round(postcode.distance.m) return output_json({ 'postcode': pc, })
def nearest(request, srid, x, y, format='json'): location = Point(float(x), float(y), srid=int(srid)) set_timeout(format) try: postcode = Postcode.objects.filter(location__distance_gte=( location, D(mi=0) )).distance(location).order_by('distance')[0] except QueryCanceledError: raise ViewException(format, 'That query was taking too long to compute.', 500) except DatabaseError, e: if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500)
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if isinstance(area, HttpResponse): return area all_areas = area.polygons.all() if len(all_areas) > 1: all_areas = all_areas.collect() elif len(all_areas) == 1: all_areas = all_areas[0].polygon else: return output_error(format, 'No polygons found', 404) generation = Generation.objects.current() args = { 'generation_low__lte': generation, 'generation_high__gte': generation, } type = request.REQUEST.get('type', '') if ',' in type: args['type__in'] = type.split(',') elif type: args['type'] = type elif area.type in ('EUR'): args['type'] = area.type if isinstance(query_type, list): or_queries = [ Q(**{'polygons__polygon__%s' % t: all_areas}) for t in query_type ] areas = Area.objects.exclude(id=area.id).filter(**args) areas = areas.filter(reduce(operator.or_, or_queries)) elif len(all_areas) == 1: areas = Area.objects.intersect(query_type, area) areas = areas.exclude(id=area.id).filter(**args) else: areas = Area.objects.exclude(id=area.id).filter(**args) areas = areas.filter(**{'polygons__polygon__%s' % query_type : all_areas }) areas = areas.distinct() set_timeout(format) try: if format == 'html': return output_html(request, title % ('<a href="/area/%d.html">%s</a>' % (area.id, area.name)), areas, norobots=True ) return output_json( dict( (a.id, a.as_dict() ) for a in areas ) ) except QueryCanceledError: return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
def example_postcode_for_area(request, area_id, format='json'): area = get_object_or_404(Area, format=format, id=area_id) try: pc = Postcode.objects.filter(areas=area).order_by()[0] except: set_timeout(format) try: pc = Postcode.objects.filter_by_area(area).order_by()[0] except QueryCanceledError: raise ViewException(format, 'That query was taking too long to compute.', 500) except DatabaseError, e: if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: pc = None
def example_postcode_for_area(request, area_id, legacy=False, format='json'): area = get_object_or_404(Area, format=format, id=area_id) if isinstance(area, HttpResponse): return area try: pc = Postcode.objects.filter(areas=area).order_by()[0] except: set_timeout(format) try: pc = Postcode.objects.filter_by_area(area).order_by()[0] except QueryCanceledError: return output_error(format, 'That query was taking too long to compute.', 500) except: pc = None if pc: pc = pc.get_postcode_display() if format == 'html': return render_to_response('example-postcode.html', { 'area': area, 'postcode': pc }) return output_json(pc)
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if isinstance(area, HttpResponse): return area if not area.polygons.count(): return output_error(format, 'No polygons found', 404) generation = Generation.objects.current() args = { 'generation_low__lte': generation, 'generation_high__gte': generation, } type = request.REQUEST.get('type', '') if ',' in type: args['type__code__in'] = type.split(',') elif type: args['type__code'] = type elif area.type.code in ('EUR'): args['type__code'] = area.type.code set_timeout(format) areas = Area.objects.intersect( query_type, area).exclude(id=area.id).filter(**args).distinct() try: if format == 'html': return output_html(request, title % ('<a href="/area/%d.html">%s</a>' % (area.id, area.name)), areas, norobots=True) return output_json(dict((a.id, a.as_dict()) for a in areas)) except QueryCanceledError: return output_error( format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500) except DatabaseError, e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if 'canceling statement due to statement timeout' not in e.args[0]: raise return output_error( format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
def example_postcode_for_area(request, area_id, format='json'): area = get_object_or_404(Area, format=format, id=area_id) try: pc = Postcode.objects.filter(areas=area).order_by()[0] except: set_timeout(format) try: pc = Postcode.objects.filter_by_area(area).order_by()[0] except DatabaseError as e: if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: pc = None if pc: pc = pc.get_postcode_display() if format == 'html': return render(request, 'mapit/example-postcode.html', {'area': area, 'postcode': pc}) return output_json(pc)
def nearest(request, srid, x, y, format='json'): location = Point(float(x), float(y), srid=int(srid)) set_timeout(format) try: # Transform to database SRID for comparison (GeometryCentroidDistance does not yet do this) location.transform(4326) except: raise ViewException(format, _('Point outside the area geometry'), 400) try: # Ordering will be in 'degrees', so fetch a few and sort by actual distance postcodes = Postcode.objects.annotate( centroid_distance=GeometryCentroidDistance( 'location', location)).annotate(distance=Distance( 'location', location)).order_by('centroid_distance')[:100] postcodes = sorted(postcodes, key=attrgetter('distance')) postcode = postcodes[0] except DatabaseError as e: if 'Cannot find SRID' in e.args[0]: raise ViewException(format, e.args[0], 400) if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: raise ViewException(format, 'No postcode found near %s,%s (%s)' % (x, y, srid), 404) if format == 'html': return render(request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'json_view': 'mapit-postcode', }) pc = postcode.as_dict() pc['distance'] = round(postcode.distance.m) return output_json({ 'postcode': pc, })
def nearest(request, srid, x, y, format='json'): location = Point(float(x), float(y), srid=int(srid)) set_timeout(format) try: # Transform to database SRID for comparison (GeometryCentroidDistance does not yet do this) location.transform(4326) except: raise ViewException(format, _('Point outside the area geometry'), 400) try: # Ordering will be in 'degrees', so fetch a few and sort by actual distance postcodes = Postcode.objects.annotate( centroid_distance=GeometryCentroidDistance('location', location) ).annotate( distance=Distance('location', location) ).order_by('centroid_distance')[:100] postcodes = sorted(postcodes, key=attrgetter('distance')) postcode = postcodes[0] except DatabaseError as e: if 'Cannot find SRID' in e.args[0]: raise ViewException(format, e.args[0], 400) if 'canceling statement due to statement timeout' not in e.args[0]: raise raise ViewException(format, 'That query was taking too long to compute.', 500) except: raise ViewException(format, 'No postcode found near %s,%s (%s)' % (x, y, srid), 404) if format == 'html': return render(request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'json_view': 'mapit-postcode', }) pc = postcode.as_dict() pc['distance'] = round(postcode.distance.m) return output_json({ 'postcode': pc, })
def area_intersect(query_type, title, request, area_id, format): area = get_object_or_404(Area, format=format, id=area_id) if isinstance(area, HttpResponse): return area if not area.polygons.count(): return output_error(format, 'No polygons found', 404) generation = Generation.objects.current() args = { 'generation_low__lte': generation, 'generation_high__gte': generation, } type = request.REQUEST.get('type', '') if ',' in type: args['type__code__in'] = type.split(',') elif type: args['type__code'] = type elif area.type.code in ('EUR'): args['type__code'] = area.type.code set_timeout(format) areas = Area.objects.intersect(query_type, area).exclude(id=area.id).filter(**args).distinct() try: if format == 'html': return output_html(request, title % ('<a href="%sarea/%d.html">%s</a>' % (reverse('mapit_index'), area.id, area.name)), areas, norobots=True ) return output_json( dict( (a.id, a.as_dict() ) for a in areas ) ) except QueryCanceledError: return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500) except DatabaseError, e: # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead if 'canceling statement due to statement timeout' not in e.args[0]: raise return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)