コード例 #1
0
ファイル: search.py プロジェクト: omniscale/gbi-server
    def search(self, query, user_token):
        from gbi_server.model import User
        user = User.by_authproxy_token(user_token)
        if not user:
            raise exceptions.Unauthorized()

        coverage = self.limiter.coverage(user_token)
        if not coverage:
            current_app.logger.debug("found no coverage user=%s query=%s", user, request.url)
            return None

        query.intersection(coverage, 3857)

        # query.ids(['072578-040-00042/000'])
        # f.near((7.88475, 49.859677), 4326, dist=500)
        # q = sql.select([parcel_table]).where(parcel_table.c.number == cleanup_id('072578-040-00042/000'))

        features = []
        query.limit(1000)
        sub = query.as_sa()
        q = sql.select([sub.c.identifier, sql.func.st_astext(sql.func.st_transform(sub.c.geometry, '3857')).label('geometry')])

        with self.engine.connect() as conn:
            for r in conn.execute(q):
                features.append({
                    "type": "Feature",
                    "properties": {
                        "id": r.identifier,
                    },
                    "geometry": mapping(shapely.wkt.loads(r.geometry)),
                })

        return features
コード例 #2
0
ファイル: tilelimit.py プロジェクト: gr2m/gbi-server
    def create(self, user_token, layer):
        from gbi_server.model import User

        user = User.by_authproxy_token(user_token)
        if not user:
            raise InvalidUserToken()

        result = db.session.query(WMTS, WMTS.view_coverage.transform(3857).wkt()).filter_by(name=layer).first()
        if result:
            wmts, view_coverage = result
            if wmts and wmts.is_public:
                return wkt.loads(view_coverage)

        if user.is_customer:
            couch_url = self.couchdb_url
            couchdb = CouchDBBox(couch_url, '%s_%s' % (SystemConfig.AREA_BOX_NAME, user.id))
            geom = couchdb.layer_extent(self.geometry_layer)
            return optimize_geometry(geom) if geom else None
        elif user.is_service_provider:
            couch_url = self.couchdb_url
            couchdb = CouchDBBox(couch_url, '%s_%s' % (SystemConfig.AREA_BOX_NAME, user.id))
            geom = couchdb.layer_extent()
            return optimize_geometry(geom) if geom else None
        elif user.is_admin or user.is_consultant:
            # permit access to everything
            return box(-20037508.3428, -20037508.3428, 20037508.3428, 20037508.3428)

        return None
コード例 #3
0
ファイル: blueprint.py プロジェクト: dgreyling/gbi-server
def update_download_coverage(user_token):
    user = User.by_authproxy_token(user_token)
    if not user:
        json_abort(401, 'unknown user token')

    signals.features_updated.send(user)

    return jsonify({'sucess': True})
コード例 #4
0
ファイル: blueprint.py プロジェクト: omniscale/gbi-server
def update_download_coverage(user_token):
    user = User.by_authproxy_token(user_token)
    if not user:
        json_abort(401, 'unknown user token')

    signals.features_updated.send(user)

    return jsonify({'sucess': True})
コード例 #5
0
def search_log_from_features(token, features):
    user = User.by_authproxy_token(token)
    sl = SearchLog(user=user)
    for f in features:
        g = SearchLogGeometry(
            identifier=f['properties']['id'],
            geometry='SRID=3857;' + asShape(f['geometry']).wkt,
        )
        sl.geometries.append(g)

    return sl
コード例 #6
0
ファイル: blueprint.py プロジェクト: omniscale/gbi-server
def search_log_from_features(token, features):
    user = User.by_authproxy_token(token)
    sl = SearchLog(user=user)
    for f in features:
        g = SearchLogGeometry(
            identifier=f['properties']['id'],
            geometry='SRID=3857;' + asShape(f['geometry']).wkt,
        )
        sl.geometries.append(g)

    return sl
コード例 #7
0
ファイル: blueprint.py プロジェクト: dgreyling/gbi-server
def log(user_token):
    if request.headers['content-type'] != 'application/json':
        json_abort(406, "request content-type not application/json")

    try:
        log_record = json.loads(request.data)
    except (TypeError, ValueError):
        json_abort(400, 'invalid JSON')

    try:
        user = User.by_authproxy_token(user_token)
        if not user:
            json_abort(401, 'unknown user token')

        if user.email != log_record['user']:
            json_abort(401, 'user token does not match user email')

        time = log_record['time']
        action = log_record['action']
    except KeyError, ex:
        json_abort(400, 'missing %s in log record' % ex)
コード例 #8
0
ファイル: blueprint.py プロジェクト: omniscale/gbi-server
def log(user_token):
    if request.headers['content-type'] != 'application/json':
        json_abort(406, "request content-type not application/json")

    try:
        log_record = json.loads(request.data)
    except (TypeError, ValueError):
        json_abort(400, 'invalid JSON')

    try:
        user = User.by_authproxy_token(user_token)
        if not user:
            json_abort(401, 'unknown user token')

        if user.email != log_record['user']:
            json_abort(401, 'user token does not match user email')

        time = log_record['time']
        action = log_record['action']
    except KeyError, ex:
        json_abort(400, 'missing %s in log record' % ex)
コード例 #9
0
ファイル: blueprint.py プロジェクト: kaiCu/gbi-server
def log(user_token):
    if request.headers["content-type"] != "application/json":
        json_abort(406, "request content-type not application/json")

    try:
        log_record = json.loads(request.data)
    except (TypeError, ValueError):
        json_abort(400, "invalid JSON")

    try:
        user = User.by_authproxy_token(user_token)
        if not user:
            json_abort(401, "unknown user token")

        if user.email != log_record["user"]:
            json_abort(401, "user token does not match user email")

        time = log_record["time"]
        action = log_record["action"]
    except KeyError, ex:
        json_abort(400, "missing %s in log record" % ex)
コード例 #10
0
ファイル: search.py プロジェクト: dgreyling/gbi-server
    def search(self, query, user_token):
        from gbi_server.model import User
        user = User.by_authproxy_token(user_token)
        if not user:
            raise exceptions.Unauthorized()

        coverage = self.limiter.coverage(user_token)
        if not coverage:
            current_app.logger.debug("found no coverage user=%s query=%s",
                                     user, request.url)
            return None

        query.intersection(coverage, 3857)

        # query.ids(['072578-040-00042/000'])
        # f.near((7.88475, 49.859677), 4326, dist=500)
        # q = sql.select([parcel_table]).where(parcel_table.c.number == cleanup_id('072578-040-00042/000'))

        features = []
        query.limit(1000)
        sub = query.as_sa()
        q = sql.select([
            sub.c.identifier,
            sql.func.st_astext(sql.func.st_transform(sub.c.geometry,
                                                     '3857')).label('geometry')
        ])

        with self.engine.connect() as conn:
            for r in conn.execute(q):
                features.append({
                    "type":
                    "Feature",
                    "properties": {
                        "id": r.identifier,
                    },
                    "geometry":
                    mapping(shapely.wkt.loads(r.geometry)),
                })

        return features
コード例 #11
0
ファイル: limiter.py プロジェクト: dgreyling/gbi-server
    def create(self, user_token, layer):
        from gbi_server.model import User
        from gbi_server.model import WMTS

        from gbi_server.extensions import db

        user = User.by_authproxy_token(user_token)
        if not user:
            raise InvalidUserToken()

        result = db.session.query(WMTS, ST_Transform(
            WMTS.view_coverage, 3857)).filter_by(name=layer).first()

        if result:
            wmts, view_coverage = result
            if wmts and wmts.is_public:
                return to_shape(view_coverage)

        if user.is_customer:
            couch_url = self.couchdb_url
            couchdb = CouchDBBox(
                couch_url, '%s_%s' % (SystemConfig.AREA_BOX_NAME, user.id))
            geom = couchdb.layer_extent(self.geometry_layer)
            return optimize_geometry(geom) if geom else None
        elif user.is_service_provider:
            couch_url = self.couchdb_url
            couchdb = CouchDBBox(
                couch_url, '%s_%s' % (SystemConfig.AREA_BOX_NAME, user.id))
            geom = couchdb.layer_extent()
            return optimize_geometry(geom) if geom else None
        elif user.is_admin or user.is_consultant:
            # permit access to everything
            return box(-20037508.3428, -20037508.3428, 20037508.3428,
                       20037508.3428)

        return None
コード例 #12
0
ファイル: dblimit.py プロジェクト: gr2m/gbi-server
    def create(self, user_token, dbname):
        from gbi_server.model import User

        user = User.by_authproxy_token(user_token)
        if not user:
            raise InvalidUserToken()

        if user.is_customer or user.is_service_provider:
            if dbname in (
                '%s_%s' % (SystemConfig.AREA_BOX_NAME, user.id),
                '%s_%s' % (SystemConfig.CUSTOMER_BOX_NAME, user.id),
            ):
                return 'rw'
            if dbname in (
                '%s_%s' % (SystemConfig.CONSULTANT_BOX_NAME, user.id),
            ):
                return 'r'
        elif user.is_admin or user.is_consultant:
            if dbname.startswith('%s_' % (SystemConfig.CONSULTANT_BOX_NAME, )):
                return 'rw'
            elif dbname.startswith('%s_' % (SystemConfig.CUSTOMER_BOX_NAME, )):
                return 'r'

        return 'no'