예제 #1
0
    def _proto_read(self, layer):
        """ Read features for the layer based on the self.request. """
        proto = self._get_protocol_for_layer(layer)
        if layer.public:
            return proto.read(self.request)
        user = self.request.user
        if user is None:
            raise HTTPForbidden()
        cls = proto.mapped_class
        geom_attr = proto.geom_attr
        ras = DBSession.query(RestrictionArea.area,
                              functions.srid(RestrictionArea.area))
        ras = ras.join(RestrictionArea.roles)
        ras = ras.join(RestrictionArea.layers)
        ras = ras.filter(Role.id == user.role.id)
        ras = ras.filter(Layer.id == layer.id)
        collect_ra = []
        use_srid = -1
        for ra, srid in ras.all():
            if ra is None:
                return proto.read(self.request)
            else:
                use_srid = srid
                collect_ra.append(wkb.loads(str(ra.geom_wkb)))
        if len(collect_ra) == 0:  # pragma: no cover
            raise HTTPForbidden()

        ra = cascaded_union(collect_ra)
        filter_ = and_(
            create_filter(self.request, cls, geom_attr),
            functions.gcontains(func.st_geomfromtext(ra.wkt, use_srid),
                                getattr(cls, geom_attr)))

        return proto.read(self.request, filter=filter_)
예제 #2
0
파일: uik.py 프로젝트: nextgis/uik_geo
def get_president_uiks(context, request):
    page_size = 100
    is_filter_applied = False
    filter = json.loads(request.GET['filter'])
    clauses = []
    if 'filter' in request.GET:
        filter['uik_2012']['address'] = filter['uik_2012']['address'].encode('UTF-8').strip()
        filter['uik_2012']['number'] = filter['uik_2012']['number'].encode('UTF-8').strip()
        if filter['uik_2012']['address'] or filter['uik_2012']['number']:
            is_filter_applied = True
            if filter['uik_2012']['address'].__len__() > 3:
                address = '%' + filter['uik_2012']['address'] + '%'
                clauses.append(VotingStation.address.ilike(address))
            if filter['uik_2012']['number']:
                number = filter['uik']['number']
                clauses.append(VotingStation.name == number)

    bbox = json.loads(request.params.getall('bbox')[0])
    box_geom = leaflet_bbox_to_polygon(bbox)

    uiks_for_json = {'points': {
        'count': 0,
        'layers': {
            'uik_2012': {'elements': [], 'count': 0}
        }}}

    session = DBSession()
    if is_filter_applied:
        contains = functions.gcontains(box_geom, Location.point).label('contains')
        uiks_from_db = session.query(VotingStation, Location.point.x, Location.point.y) \
            .join(VotingStation.location) \
            .filter(*clauses) \
            .order_by(contains.desc()) \
            .limit(page_size) \
            .all()
        if len(uiks_from_db) < page_size:
            uiks_for_json['points']['count'] = len(uiks_from_db)
        else:
            uiks_for_json['points']['count'] = session.query(VotingStation.id) \
                .filter(*clauses) \
                .count()
    else:
        uiks_from_db = session.query(VotingStation, Location.point.x, Location.point.y) \
            .join(VotingStation.location) \
            .filter(Location.point.within(box_geom)) \
            .all()
        uiks_for_json['points']['count'] = len(uiks_from_db)

    for uik in uiks_from_db:
        uiks_for_json['points']['layers']['uik_2012']['elements'].append(_get_uik2012_from_uik_db(uik))
        uiks_for_json['points']['layers']['uik_2012']['count'] = uiks_for_json['points']['count']

    session.close()
    return Response(json.dumps(uiks_for_json), content_type='application/json')
예제 #3
0
def get_president_uiks(context, request):
    page_size = 100
    is_filter_applied = False
    filter = json.loads(request.GET['filter'])
    clauses = []
    if 'filter' in request.GET:
        filter['uik_2012']['address'] = filter['uik_2012']['address'].encode('UTF-8').strip()
        filter['uik_2012']['number'] = filter['uik_2012']['number'].encode('UTF-8').strip()
        if filter['uik_2012']['address'] or filter['uik_2012']['number']:
            is_filter_applied = True
            if filter['uik_2012']['address'].__len__() > 3:
                address = '%' + filter['uik_2012']['address'] + '%'
                clauses.append(VotingStation.address.ilike(address))
            if filter['uik_2012']['number']:
                number = filter['uik']['number']
                clauses.append(VotingStation.name == number)

    bbox = json.loads(request.params.getall('bbox')[0])
    box_geom = leaflet_bbox_to_polygon(bbox)

    uiks_for_json = {'points': {
        'count': 0,
        'layers': {
            'uik_2012': {'elements': [], 'count': 0}
        }}}

    session = DBSession()
    if is_filter_applied:
        contains = functions.gcontains(box_geom, Location.point).label('contains')
        uiks_from_db = session.query(VotingStation, Location.point.x, Location.point.y) \
            .join(VotingStation.location) \
            .filter(*clauses) \
            .order_by(contains.desc()) \
            .limit(page_size) \
            .all()
        if len(uiks_from_db) < page_size:
            uiks_for_json['points']['count'] = len(uiks_from_db)
        else:
            uiks_for_json['points']['count'] = session.query(VotingStation.id) \
                .filter(*clauses) \
                .count()
    else:
        uiks_from_db = session.query(VotingStation, Location.point.x, Location.point.y) \
            .join(VotingStation.location) \
            .filter(Location.point.within(box_geom)) \
            .all()
        uiks_for_json['points']['count'] = len(uiks_from_db)

    for uik in uiks_from_db:
        uiks_for_json['points']['layers']['uik_2012']['elements'].append(_get_uik2012_from_uik_db(uik))
        uiks_for_json['points']['layers']['uik_2012']['count'] = uiks_for_json['points']['count']

    return Response(json.dumps(uiks_for_json), content_type='application/json')
예제 #4
0
    def _proto_read(self, layer):
        """ Read features for the layer based on the self.request. """
        proto = self._get_protocol_for_layer(layer)
        if layer.public:
            return proto.read(self.request)
        user = self.request.user
        if user is None:
            raise HTTPForbidden()
        cls = proto.mapped_class
        geom_attr = proto.geom_attr
        ras = DBSession.query(RestrictionArea.area, functions.srid(RestrictionArea.area))
        ras = ras.join(RestrictionArea.roles)
        ras = ras.join(RestrictionArea.layers)
        ras = ras.filter(Role.id == user.role.id)
        ras = ras.filter(Layer.id == layer.id)
        collect_ra = []
        use_srid = -1
        for ra, srid in ras.all():
            if ra is None:
                return proto.read(self.request)
            else:
                use_srid = srid
                collect_ra.append(wkb.loads(str(ra.geom_wkb)))
        if len(collect_ra) == 0:  # pragma: no cover
            raise HTTPForbidden()

        ra = cascaded_union(collect_ra)
        filter_ = and_(
            create_filter(self.request, cls, geom_attr),
            functions.gcontains(
                func.st_geomfromtext(ra.wkt, use_srid),
                getattr(cls, geom_attr)
            )
        )

        return proto.read(self.request, filter=filter_)
예제 #5
0
def get_all(context, request):
    page_size = 50
    is_filter_applied = False
    filter = json.loads(request.GET['filter'])
    clauses = []
    if filter['uik']:
        filter['uik']['address'] = filter['uik']['address'].encode('UTF-8').strip()
        filter['uik']['number'] = filter['uik']['number'].encode('UTF-8').strip()
        if filter['uik']['address'] or filter['uik']['number']:
            is_filter_applied = True
            if filter['uik']['address'].__len__() > 3:
                address = '%' + filter['uik']['address'] + '%'
                clauses.append(Uik.address_voting.ilike(address))
            if filter['uik']['number']:
                number = filter['uik']['number']
                clauses.append(Uik.number_official == number)

    bbox = json.loads(request.params.getall('bbox')[0])
    box_geom = leaflet_bbox_to_polygon(bbox)

    uiks_for_json = {'points': {
        'count': 0,
        'layers': {
            'checked': {'elements': [], 'count': 0},
            'unchecked': {'elements': [], 'count': 0},
            'blocked': {'elements': [], 'count': 0}
        }}}

    session = DBSession()
    if is_filter_applied:
        contains = functions.gcontains(box_geom, Uik.point).label('contains')
        uiks_from_db = session.query(Uik, Uik.point.x, Uik.point.y) \
            .filter(*clauses) \
            .order_by(contains.desc()) \
            .limit(page_size) \
            .all()
        if len(uiks_from_db) < page_size:
            uiks_for_json['points']['count'] = len(uiks_from_db)
        else:
            uiks_for_json['points']['count'] = session.query(Uik.id) \
                .filter(*clauses) \
                .count()
    else:
        uiks_from_db = session.query(Uik, Uik.point.x, Uik.point.y) \
            .filter(Uik.point.within(box_geom)) \
            .all()
        uiks_for_json['points']['count'] = len(uiks_from_db)

    for uik in uiks_from_db:
        if uik[0].is_blocked:
            uiks_for_json['points']['layers']['blocked']['elements'].append(_get_uik_from_uik_db(uik))
            continue
        if uik[0].is_applied:
            uiks_for_json['points']['layers']['checked']['elements'].append(_get_uik_from_uik_db(uik))
            continue
        uiks_for_json['points']['layers']['unchecked']['elements'].append(_get_uik_from_uik_db(uik))

    uiks_for_json['points']['layers']['blocked']['count'] = len(uiks_for_json['points']['layers']['blocked']['elements'])
    uiks_for_json['points']['layers']['checked']['count'] = len(uiks_for_json['points']['layers']['checked']['elements'])
    uiks_for_json['points']['layers']['unchecked']['count'] = len(uiks_for_json['points']['layers']['unchecked']['elements'])

    uiks_result = {'data': uiks_for_json}

    return Response(json.dumps(uiks_result), content_type='application/json')