Beispiel #1
0
    def get(self, request, *args, **kwargs):
        validation = self.extract_request(request)
        if validation:
            return self.api_response({'error': validation})

        # get data
        if 'extent' in request.GET:
            polygon = parse_bbox(request.GET.get('extent'))

            # if page is not presented, use page = 1
            page = self.page
            if not page:
                page = 1

            facilities = self.get_query_by_page(
                get_heathsites_master().in_polygon(polygon), page)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)

        elif 'page' in request.GET:
            if not self.page:
                return self.api_response({'error': "page is wrong type"})
            facilities = self.get_query_by_page(get_heathsites_master(),
                                                self.page)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)
        else:
            return self.api_response({'error': "need parameter"})
Beispiel #2
0
    def get_healthsites(self, request):

        # check extent data
        extent = request.GET.get('extent', None)
        queryset = LocalityOSMView.objects.all()
        if extent:
            try:
                polygon = parse_bbox(request.GET.get('extent'))
            except (ValueError, IndexError):
                raise BadRequestError('extent is incorrect format')
            queryset = queryset.in_polygon(polygon)

        # check by country
        country = request.GET.get('country', None)
        if country == 'World':
            country = None
        if country:
            # getting country's polygon
            try:
                country = Country.objects.get(
                    name__iexact=country)
                polygons = country.polygon_geometry
                queryset = queryset.in_polygon(polygons)
            except Country.DoesNotExist:
                raise BadRequestError('%s is not found or not a country.' % country)
        return queryset
Beispiel #3
0
    def get(self, request, *args, **kwargs):
        validation = self.extract_request(request)
        if validation:
            return self.api_response(
                {'error': validation}
            )

        # get data
        if 'extent' in request.GET:
            polygon = parse_bbox(request.GET.get('extent'))

            # if page is not presented, use page = 1
            page = self.page
            if not page:
                page = 1

            facilities = self.get_query_by_page(
                get_heathsites_master().in_polygon(polygon), page
            )
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)

        elif 'page' in request.GET:
            if not self.page:
                return self.api_response(
                    {'error': 'page is wrong type'}
                )
            facilities = self.get_query_by_page(get_heathsites_master(), self.page)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)
        else:
            return self.api_response(
                {'error': 'need parameter'}
            )
Beispiel #4
0
    def get_healthsites(self, request):

        # check extent data
        extent = request.GET.get('extent', None)
        queryset = LocalityOSMView.objects.all()
        if extent:
            try:
                polygon = parse_bbox(request.GET.get('extent'))
            except (ValueError, IndexError):
                raise BadRequestError('extent is incorrect format')
            queryset = queryset.in_polygon(polygon)

        # check by country
        country = request.GET.get('country', None)
        if country == 'World':
            country = None
        if country:
            # getting country's polygon
            try:
                country = Country.objects.get(name__iexact=country)
                polygons = country.polygon_geometry
                queryset = queryset.in_polygon(polygons)
            except Country.DoesNotExist:
                raise BadRequestError('%s is not found or not a country.' %
                                      country)
        return queryset
Beispiel #5
0
    def get(self, request, *args, **kwargs):
        super(LocalitySearchApiView, self).get(request)
        if not 'name' in request.GET or not 'search_type' in request.GET:
            return HttpResponse(
                self.formating_response({'error': "parameter is not enough"}),
                content_type='application/json')

        place_name = request.GET['name']
        search_type = request.GET['search_type']

        if not place_name:
            return HttpResponse(
                self.formating_response({'error': "place name parameter can't be empty"}),
                content_type='application/json')

        if search_type == "placename":
            try:
                country = Country.objects.get(name__icontains=place_name)
                polygon = country.polygon_geometry
            except Country.DoesNotExist:
                # if country is not found
                output = search_place(request, place_name)
                output['countries'] = ""
                bbox = output["southwest_lng"] + "," + output["southwest_lat"] + "," + output["northeast_lng"] + "," + \
                       output["northeast_lat"]
                try:
                    polygon = parse_bbox(bbox)
                except ValueError:
                    return HttpResponse(
                        self.formating_response({'error': "place is not found"}),
                        content_type='application/json')

            if 'facility_type' in request.GET:
                facility_type = request.GET['facility_type']
            else:
                facility_type = ""

            facilities = self.get_healthsite_master_by_polygon(polygon, facility_type)
            return HttpResponse(
                self.formating_response(facilities),
                content_type='application/json')

        elif search_type == "facility":
            facilities = Locality.objects.filter(name__icontains=place_name)
            facilities_dict = []
            for healthsite in facilities:
                if self.format == 'geojson':
                    facilities_dict.append(geojson_serializer(healthsite))
                else:
                    facilities_dict.append(json_serializer(healthsite))

            return HttpResponse(
                self.formating_response(facilities_dict),
                content_type='application/json')
        else:
            return HttpResponse(
                self.formating_response({'error': "search type is wrong"}),
                content_type='application/json')
Beispiel #6
0
def filter_locality(extent=None,
                    country=None,
                    timestamp_from=None,
                    timestamp_to=None,
                    place=None):
    """ Filter osm locality by extent and country
    :param extent: extent of data
    :type extent: str (with comma separator)

    :param country: specific country
    :type country: str

    :param timestamp_from: start time
    :type timestamp_from: timestamp

    :param timestamp_to: end time
    :type timestamp_to: timestamp

    :return: LocalityOSMView
    """
    # check extent data
    queryset = all_locality()
    if extent:
        try:
            polygon = parse_bbox(extent)
        except (ValueError, IndexError):
            raise Exception('extent is incorrect format')
        queryset = queryset.in_polygon(polygon)

    # check by country
    if country:
        try:
            # getting country's polygon
            country = Country.objects.get(name__iexact=country)
            if country:
                polygons = country.polygon_geometry
                queryset = queryset.in_polygon(polygons)
        except Country.DoesNotExist:
            raise Exception('%s is not found or not a country.' % country)

    if place:
        try:
            geo = search_by_geoname(place)
            bbox = (geo['southwest']['lng'], geo['southwest']['lat'],
                    geo['northeast']['lng'], geo['northeast']['lat'])
            geom = Polygon.from_bbox(bbox)
            queryset = queryset.filter(geometry__within=geom)
        except Exception:
            pass

    if timestamp_from:
        queryset = queryset.filter(changeset_timestamp__gte=timestamp_from)

    if timestamp_to:
        queryset = queryset.filter(changeset_timestamp__lte=timestamp_to)

    return queryset
Beispiel #7
0
    def get(self, request, *args, **kwargs):  # NOQA
        validation = self.extract_request(request)
        if validation:
            return self.api_response({'error': validation})

        if 'name' not in request.GET or 'search_type' not in request.GET:
            return self.api_response({'error': 'parameter is not enough'})

        place_name = request.GET['name']
        search_type = request.GET['search_type']

        if search_type == 'placename':
            try:
                countries = Country.objects.filter(name__icontains=place_name)
                if len(countries) == 0:
                    raise Country.DoesNotExist
                country = None
                for country_query in countries:
                    if not country:
                        country = country_query
                    else:
                        if len(country.name) > len(country_query.name):
                            country = country_query
                polygon = country.polygon_geometry
            except Country.DoesNotExist:
                # if country is not found
                output = search_place(request, place_name)
                output['countries'] = ''
                bbox = (output['southwest_lng'] + ',' +
                        output['southwest_lat'] + ',' +
                        output['northeast_lng'] + ',' +
                        output['northeast_lat'])
                try:
                    polygon = parse_bbox(bbox)
                except ValueError:
                    return self.api_response({'error': 'place is not found'})

            facility_type = ''
            if 'facility_type' in request.GET:
                facility_type = request.GET['facility_type']

            facilities = self.get_healthsite_master_by_polygon(
                polygon, facility_type)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)

        elif search_type == 'facility':
            facilities = Locality.objects.filter(name__icontains=place_name)
            if self.page:
                facilities = self.get_query_by_page(facilities, self.page)
            else:
                facilities = facilities[:100]
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)
        else:
            return self.api_response({'error': 'search type is wrong'})
Beispiel #8
0
    def _parse_request_params(self, request):
        if not(all(param in request.GET for param in ['bbox'])):
            raise Http404

        try:
            bbox_poly = parse_bbox(request.GET.get('bbox'))
        except:
            # return 404 if any of parameters are missing or not parsable
            raise Http404

        return bbox_poly
Beispiel #9
0
    def _parse_request_params(self, request):
        if not (all(param in request.GET for param in ['bbox'])):
            raise Http404

        try:
            bbox_poly = parse_bbox(request.GET.get('bbox'))
        except:
            # return 404 if any of parameters are missing or not parsable
            raise Http404

        return bbox_poly
Beispiel #10
0
    def handle(self, *args, **options):

        if len(args) != 2:
            icon_size = self.default_size
        else:
            try:
                icon_size = [int(size) for size in args[0:2]]
            except Exception as e:
                raise CommandError(str(e))

        if any((size < 0 for size in icon_size)):
            # icon sizes should be positive
            raise CommandError('Icon sizes should be positive numbers')

        # check the folder
        if not os.path.exists(settings.CLUSTER_CACHE_DIR):
            os.makedirs(settings.CLUSTER_CACHE_DIR)

        for zoom in range(settings.CLUSTER_CACHE_MAX_ZOOM + 1):
            filename = os.path.join(
                settings.CLUSTER_CACHE_DIR,
                '{}_{}_{}_localities.json'.format(zoom, *icon_size)
            )

            localities = get_heathsites_master().in_bbox(parse_bbox('-180,-90,180,90'))
            object_list = cluster(localities, zoom, *icon_size)

            with open(filename, 'wb') as cache_file:
                json.dump(object_list, cache_file)

            self.stdout.write('Generated cluster cache for zoom: %s' % zoom)

        for country in Country.objects.all():
            self.stdout.write('Generating cluster for %s' % country.name)
            polygon = country.polygon_geometry
            localities = get_heathsites_master().in_polygon(polygon)
            for zoom in range(settings.CLUSTER_CACHE_MAX_ZOOM + 1):
                filename = os.path.join(
                    settings.CLUSTER_CACHE_DIR,
                    '{}_{}_{}_localities_{}.json'.format(
                        zoom, icon_size[0], icon_size[1], country.name.encode('ascii', 'ignore')
                    )
                )

                object_list = cluster(localities, zoom, *icon_size)

                with open(filename, 'wb') as cache_file:
                    json.dump(object_list, cache_file)

                self.stdout.write('Generated cluster cache for zoom: %s' % zoom)
    def handle(self, *args, **options):

        if len(args) != 2:
            icon_size = self.default_size
        else:
            try:
                icon_size = [int(size) for size in args[0:2]]
            except Exception as e:
                raise CommandError(str(e))

        if any((size < 0 for size in icon_size)):
            # icon sizes should be positive
            raise CommandError('Icon sizes should be positive numbers')

        # check the folder
        if not os.path.exists(settings.CLUSTER_CACHE_DIR):
            os.makedirs(settings.CLUSTER_CACHE_DIR)

        for zoom in range(settings.CLUSTER_CACHE_MAX_ZOOM + 1):
            filename = os.path.join(
                settings.CLUSTER_CACHE_DIR,
                '{}_{}_{}_localities.json'.format(zoom, *icon_size)
            )

            localities = get_heathsites_master().in_bbox(parse_bbox('-180,-90,180,90'))
            object_list = cluster(localities, zoom, *icon_size)

            with open(filename, 'wb') as cache_file:
                json.dump(object_list, cache_file)

            self.stdout.write('Generated cluster cache for zoom: %s' % zoom)

        for country in Country.objects.all():
            self.stdout.write('Generated cluster for %s' % country.name)
            polygon = country.polygon_geometry
            localities = get_heathsites_master().in_polygon(polygon)
            for zoom in range(settings.CLUSTER_CACHE_MAX_ZOOM + 1):
                filename = os.path.join(
                    settings.CLUSTER_CACHE_DIR,
                    '{}_{}_{}_localities_{}.json'.format(
                        zoom, icon_size[0], icon_size[1], country.name
                    )
                )

                object_list = cluster(localities, zoom, *icon_size)

                with open(filename, 'wb') as cache_file:
                    json.dump(object_list, cache_file)

                self.stdout.write('Generated cluster cache for zoom: %s' % zoom)
Beispiel #12
0
    def get(self, request):
        validation = self.validation()
        if validation:
            return HttpResponseBadRequest(validation)

        # check extent data
        extent = request.GET.get('extent', None)
        queryset = LocalityOSMView.objects.all()
        if extent:
            try:
                polygon = parse_bbox(request.GET.get('extent'))
            except (ValueError, IndexError):
                return HttpResponseBadRequest('extent is incorrect format')
            queryset = queryset.in_polygon(polygon)
        queryset = self.get_query_by_page(queryset)
        return Response(self.serialize(queryset, many=True))
Beispiel #13
0
    def get(self, request):
        validation = self.validation()
        if validation:
            return HttpResponseBadRequest(validation)

        # check extent data
        extent = request.GET.get('extent', None)
        queryset = LocalityOSMView.objects.all()
        if extent:
            try:
                polygon = parse_bbox(request.GET.get('extent'))
            except (ValueError, IndexError):
                return HttpResponseBadRequest('extent is incorrect format')
            queryset = queryset.in_polygon(polygon)
        queryset = self.get_query_by_page(queryset)
        return Response(self.serialize(queryset, many=True))
Beispiel #14
0
    def get(self, request, *args, **kwargs):
        super(FacilitiesApiView, self).get(request)
        # checking page
        if 'page' not in request.GET:
            page = None
        else:
            try:
                page = request.GET.get('page')
                page = int(page)
                if page == 0:
                    return HttpResponse(self.formating_response(
                        {'error': "page less than 1"}),
                                        content_type='application/json')
            except ValueError:
                return HttpResponse(self.formating_response(
                    {'error': "page is not a number"}),
                                    content_type='application/json')

        # get data
        if 'extent' in request.GET:
            polygon = parse_bbox(request.GET.get('extent'))
            if not page:
                page = 1
            facilities = self.get_heathsites_by_page(
                get_heathsites_master().in_polygon(polygon), page)
            return HttpResponse(self.formating_response(facilities),
                                content_type='application/json')
        elif 'page' in request.GET:
            if not page:
                return HttpResponse(self.formating_response(
                    {'error': "page is wrong type"}),
                                    content_type='application/json')
            facilities = self.get_heathsites_by_page(get_heathsites_master(),
                                                     page)
            return HttpResponse(self.formating_response(facilities),
                                content_type='application/json')
        else:
            return HttpResponse(self.formating_response(
                {'error': "need parameter"}),
                                content_type='application/json')
    def get(self, request, *args, **kwargs):  # NOQA
        validation = self.extract_request(request)
        if validation:
            return self.api_response(
                {'error': validation}
            )

        if 'name' not in request.GET or 'search_type' not in request.GET:
            return self.api_response(
                {'error': 'parameter is not enough'}
            )

        place_name = request.GET['name']
        search_type = request.GET['search_type']

        if search_type == 'placename':
            try:
                countries = Country.objects.filter(
                    name__icontains=place_name
                )
                if len(countries) == 0:
                    raise Country.DoesNotExist
                country = None
                for country_query in countries:
                    if not country:
                        country = country_query
                    else:
                        if len(country.name) > len(country_query.name):
                            country = country_query
                polygon = country.polygon_geometry
            except Country.DoesNotExist:
                # if country is not found
                output = search_place(request, place_name)
                output['countries'] = ''
                bbox = '%s,%s,%s,%s' % (
                    output['southwest_lng'], output['southwest_lat'],
                    output['northeast_lng'], output['northeast_lat']
                )
                try:
                    polygon = parse_bbox(bbox)
                except ValueError:
                    return self.api_response(
                        {'error': 'place is not found'}
                    )

            facility_type = ''
            if 'facility_type' in request.GET:
                facility_type = request.GET['facility_type']

            facilities = self.get_healthsite_master_by_polygon(polygon, facility_type)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)

        elif search_type == 'facility':
            facilities = Locality.objects.filter(name__icontains=place_name)
            if self.page:
                facilities = self.get_query_by_page(facilities, self.page)
            else:
                facilities = facilities[:100]
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)
        else:
            return self.api_response(
                {'error': 'search type is wrong'}
            )
Beispiel #16
0
    def get(self, request, *args, **kwargs):
        validation = self.extract_request(request)
        if validation:
            return self.api_response(
                {'error': validation}
            )

        if not 'name' in request.GET or not 'search_type' in request.GET:
            return self.api_response(
                {'error': "parameter is not enough"}
            )

        place_name = request.GET['name']
        search_type = request.GET['search_type']

        if search_type == "placename":
            try:
                countries = Country.objects.filter(
                    name__icontains=place_name
                )
                if len(countries) == 0:
                    raise Country.DoesNotExist
                country = None
                for country_query in countries:
                    if not country:
                        country = country_query
                    else:
                        if len(country.name) > len(country_query.name):
                            country = country_query
                polygon = country.polygon_geometry
            except Country.DoesNotExist:
                # if country is not found
                output = search_place(request, place_name)
                output['countries'] = ""
                bbox = output["southwest_lng"] + "," + \
                       output["southwest_lat"] + "," + \
                       output["northeast_lng"] + "," + \
                       output["northeast_lat"]
                try:
                    polygon = parse_bbox(bbox)
                except ValueError:
                    return self.api_response(
                        {'error': "place is not found"}
                    )

            facility_type = ""
            if 'facility_type' in request.GET:
                facility_type = request.GET['facility_type']

            facilities = self.get_healthsite_master_by_polygon(polygon, facility_type)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)

        elif search_type == "facility":
            facilities = Locality.objects.filter(name__icontains=place_name)
            facilities = self.query_to_json(facilities, self.format)
            return self.api_response(facilities)
        else:
            return self.api_response(
                {'error': "search type is wrong"}
            )