コード例 #1
0
ファイル: upgrade.py プロジェクト: fgpv-vpgf/rcs
    def post(self, key):
        """
        A REST endpoint for upgrading a previous registration from v1 to v2.

        :param key: A unique identifier for the dataset
        :type key: str
        :returns: JSON Response -- 200 on success; 4xx if problems are encountered
        """
        dbdata = db.get_raw(key)

        if dbdata is None:
            return '{"msg":"Record not found in database"}', 404
        elif dbdata.get('version') == '2.0':
            return '{"msg":"Already upgraded"}', 200
        elif dbdata['data'].get('request') is None:
            return '{"msg":"Previous request was not cached (request caching added in 1.8.0)"}', 409

        try:
            v1_request = dbdata['data']['request']
            upgrade_method = wms_upgrade if v1_request['payload_type'] == 'wms' else feat_upgrade
            v2_request = {lang: upgrade_method(v1_request[lang]) for lang in current_app.config['LANGS']}
            print v2_request
            v2_node, v1_node = regparse.make_node(key, v2_request, current_app.config)
            db.put_doc(key, v2_node.values()[0]['layerType'], v2_request, layer_config=v2_node, v1_config=v1_node)
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            current_app.logger.error('Failed to upgrade {0}'.format(key), exc_info=e)
            return Response(json.dumps(msg), mimetype='application/json', status=400)

        success = {"msg": "Upgraded", "version": "2.0", "key": key}
        return Response(json.dumps(success), mimetype='application/json', status=200)
コード例 #2
0
ファイル: rcs.py プロジェクト: jsmoreau/rcs
    def get(self, lang, smallkeylist, sortarg=''):
        """
        A REST endpoint for fetching a single document from the doc store.

        :param lang: A two letter language code for the response
        :type lang: str
        :param smallkeylist: A comma separated string of short keys each of which identifies a single dataset
        :type smallkeylist: str
        :param sortargs: 'sort' if returned list should be sorted based on geometry
        :type sortargs: str
        :returns: list -- an array of JSON configuration fragments (empty error objects are added where keys do not match)
        """
        keys = [ x.strip() for x in smallkeylist.split(',') ]
        unsorted_docs = [ db.get_doc(smallkey, lang, self.version) for smallkey in keys ]
        if sortarg == 'sort':
            #used to retrieve geometryType
            dbdata = [ db.get_raw(smallkey) for smallkey in keys ]
            lines = []
            polys = []
            points = []
            for rawdata,doc in zip(dbdata, unsorted_docs):
                #Point
                if rawdata["data"]["en"]["geometryType"] == "esriGeometryPoint":
                    points.append(doc)
                #Polygon
                elif rawdata["data"]["en"]["geometryType"] == "esriGeometryPolygon":
                    polys.append(doc)
                #line
                else:
                    lines.append(doc)
            #concat lists (first in docs = bottom of layer list)
            docs = polys + lines + points
        else:
            docs = unsorted_docs
        return Response(json.dumps(docs),  mimetype='application/json')
コード例 #3
0
ファイル: update.py プロジェクト: james-rae/rcs
    def put(self, key):
        """
        A REST endpoint for updating one or more nodes of an existing request.

        :param key: A unique identifier for the dataset
        :type key: str
        :returns: JSON Response -- 200 on success; 4xx if problems are encountered
        """

        langs = ["en", "fr"]
        try:
            dbdata = db.get_raw(key)
            if dbdata is None:
                return '{"msg":"Record not found in database"}', 404
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            return Response(json.dumps(msg),
                            mimetype='application/json',
                            status=500)

        def replace_if_set(params):
            for p in params:
                if p in payload_seg:
                    request_seg[p] = payload_seg[p]

        try:
            payload = json.loads(request.data)
            for lang in langs:
                request_seg = dbdata['request'][lang]
                payload_seg = payload[lang]
                replace_if_set(['service_url', 'service_name', 'metadata'])
                if payload_seg['service_type'] in [
                        'esriFeature', 'esriImage', 'esriTile'
                ]:
                    replace_if_set(['display_field'])
                elif payload_seg['service_type'] == 'esriMapServer':
                    replace_if_set(['scrape_only', 'recursive'])
                elif payload_seg['service_type'] == 'ogcWms':
                    replace_if_set([
                        'scrape_only', 'recursive', 'legend_format',
                        'feature_info_format'
                    ])
                v2_node, v1_node = regparse.make_node(key, dbdata["request"],
                                                      current_app.config)
                db.put_doc(key,
                           payload[lang]["service_type"],
                           dbdata["request"],
                           layer_config=v2_node,
                           v1_config=v1_node)
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            return Response(json.dumps(msg),
                            mimetype='application/json',
                            status=500)
        success = {"msg": "Updated", "key": key}
        return Response(json.dumps(success),
                        mimetype='application/json',
                        status=200)
コード例 #4
0
    def post(self, key):
        """
        A REST endpoint for upgrading a previous registration from v1 to v2.

        :param key: A unique identifier for the dataset
        :type key: str
        :returns: JSON Response -- 200 on success; 4xx if problems are encountered
        """
        dbdata = db.get_raw(key)

        if dbdata is None:
            return '{"msg":"Record not found in database"}', 404
        elif dbdata.get('version') == '2.0':
            return '{"msg":"Already upgraded"}', 200
        elif dbdata['data'].get('request') is None:
            return '{"msg":"Previous request was not cached (request caching added in 1.8.0)"}', 409

        try:
            v1_request = dbdata['data']['request']
            upgrade_method = wms_upgrade if v1_request[
                'payload_type'] == 'wms' else feat_upgrade
            v2_request = {
                lang: upgrade_method(v1_request[lang])
                for lang in current_app.config['LANGS']
            }
            print v2_request
            v2_node, v1_node = regparse.make_node(key, v2_request,
                                                  current_app.config)
            db.put_doc(key,
                       v2_node.values()[0]['layerType'],
                       v2_request,
                       layer_config=v2_node,
                       v1_config=v1_node)
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            current_app.logger.error('Failed to upgrade {0}'.format(key),
                                     exc_info=e)
            return Response(json.dumps(msg),
                            mimetype='application/json',
                            status=400)

        success = {"msg": "Upgraded", "version": "2.0", "key": key}
        return Response(json.dumps(success),
                        mimetype='application/json',
                        status=200)
コード例 #5
0
ファイル: registration.py プロジェクト: dan-bowerman/rcs
    def post(self, smallkey):
        """
        A REST endpoint for updating details in a feature layer.

        :param smallkey: A unique identifier for the dataset (can be any unique string, but preferably should be short)
        :type smallkey: str
        :returns: JSON Response -- 200 on success; 400 with JSON payload of an errors array on failure
        """
        try:
            payload = json.loads(request.data)
        except Exception:
            return '{"errors":["Unparsable json"]}', 400

        fragment = {'en': {}, 'fr': {}}
        if len(payload) == 2 and 'en' in payload and 'fr' in payload:
            fragment = payload
        else:
            fragment['en'].update(payload)
            fragment['fr'].update(payload)

        dbdata = db.get_raw(smallkey)

        if dbdata is None:
            return '{"errors":["Record not found in database"]}', 404
        elif dbdata['type'] != 'feature':
            return '{"errors":["Record is not a feature layer"]}', 400

        dbdata['data']['request']['en'].update(fragment['en'])
        dbdata['data']['request']['fr'].update(fragment['fr'])

        errors = get_registration_errors(payload)
        if errors:
            resp = {'errors': errors}
            current_app.logger.info(resp)
            return Response(json.dumps(resp), mimetype='application/json', status=400)

        try:
            data = regparse.make_record(smallkey, dbdata['data']['request'], current_app.config)
        except regparse.metadata.MetadataException as mde:
            current_app.logger.warning('Metadata could not be retrieved for layer', exc_info=mde)
            abort(400, msg=mde.message)

        db.put_doc(smallkey, {'type': data['request']['payload_type'], 'data': data})

        return smallkey, 200
コード例 #6
0
ファイル: rcs.py プロジェクト: dan-bowerman/RCS-1
    def put(self, smallkey):
        """
        A REST endpoint for updating a simplification factor on a registered feature service.

        :param smallkey: A unique identifier for the dataset (can be any unique string, but preferably should be short)
        :type smallkey: str
        :returns: JSON Response -- 200 on success; 400 with JSON payload of an errors array on failure
        """
        try:
            payload = json.loads( request.data )
        except Exception:
            return '{"errors":["Unparsable json"]}',400
        
        #check that our payload has a 'factor' property that contains an integer
        if not isinstance(payload['factor'], numbers.Integral):
            resp = { 'errors': ['Invalid payload JSON'] }
            app.logger.info( resp )
            return Response(json.dumps(resp),  mimetype='application/json', status=400)
        
        intFactor = int( payload['factor'] )
        
        #grab english and french doc fragments
        dbdata = db.get_raw( smallkey )
        
        if dbdata is None:
            #smallkey/lang is not in the database
            return '{"errors":["Record not found in database"]}',404
        
        elif dbdata['type'] != 'feature':
            #layer is not a feature layer
            return '{"errors":["Record is not a feature layer"]}',400
        else:
            #add in new simplification factor            
            dbdata['data']['en']['maxAllowableOffset'] = intFactor
            dbdata['data']['fr']['maxAllowableOffset'] = intFactor
            
            #also store factor in the request, so we can preserve the factor during an update
            dbdata['data']['request']['en']['maxAllowableOffset'] = intFactor
            dbdata['data']['request']['fr']['maxAllowableOffset'] = intFactor
        
        #put back in the database
        db.put_doc( smallkey, { 'type':dbdata['type'], 'data':dbdata['data'] } )
                     
        app.logger.info( 'updated simpification factor on smallkey %(s)s to %(f)d by %(u)s' % {"s":smallkey, "f": intFactor, "u": payload['user'] } )
        return smallkey, 200
コード例 #7
0
    def put(self, smallkey):
        """
        A REST endpoint for updating a simplification factor on a registered feature service.

        :param smallkey: A unique identifier for the dataset (can be any unique string, but preferably should be short)
        :type smallkey: str
        :returns: JSON Response -- 200 on success; 400 with JSON payload of an errors array on failure
        """
        try:
            payload = json.loads(request.data)
        except Exception:
            return '{"errors":["Unparsable json"]}', 400

        # Check that our payload has a 'factor' property that contains an integer
        if not isinstance(payload['factor'], numbers.Integral):
            resp = {'errors': ['Invalid payload JSON']}
            current_app.logger.info(resp)
            return Response(json.dumps(resp), mimetype='application/json', status=400)

        intFactor = int(payload['factor'])

        # Grab english and french doc fragments
        dbdata = db.get_raw(smallkey)

        if dbdata is None:
            return '{"errors":["Record not found in database"]}', 404

        elif dbdata['type'] != 'feature':
            return '{"errors":["Record is not a feature layer"]}', 400
        else:
            # Add in new simplification factor
            dbdata['data']['en']['maxAllowableOffset'] = intFactor
            dbdata['data']['fr']['maxAllowableOffset'] = intFactor

            # Also store factor in the request, so we can preserve the factor during an update
            dbdata['data']['request']['en']['max_allowable_offset'] = intFactor
            dbdata['data']['request']['fr']['max_allowable_offset'] = intFactor

        # Update the database record
        db.put_doc(smallkey, {'type': dbdata['type'], 'data': dbdata['data']})

        current_app.logger.info('updated simpification factor on smallkey %(s)s to %(f)d by %(u)s'
                                % {"s": smallkey, "f": intFactor, "u": payload['user']})
        return smallkey, 200
コード例 #8
0
ファイル: update.py プロジェクト: fgpv-vpgf/rcs
    def put(self, key):
        """
        A REST endpoint for updating one or more nodes of an existing request.

        :param key: A unique identifier for the dataset
        :type key: str
        :returns: JSON Response -- 200 on success; 4xx if problems are encountered
        """

        langs = ["en", "fr"]
        try:
            dbdata = db.get_raw(key)
            if dbdata is None:
                return '{"msg":"Record not found in database"}', 404
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            return Response(json.dumps(msg), mimetype='application/json', status=500)

        def replace_if_set(params):
            for p in params:
                if p in payload_seg:
                    request_seg[p] = payload_seg[p]

        try:
            payload = json.loads(request.data)
            for lang in langs:
                request_seg = dbdata['request'][lang]
                payload_seg = payload[lang]
                replace_if_set(['service_url', 'service_name', 'metadata'])
                if payload_seg['service_type'] in ['esriFeature', 'esriImage', 'esriTile']:
                    replace_if_set(['display_field'])
                elif payload_seg['service_type'] == 'esriMapServer':
                    replace_if_set(['scrape_only', 'recursive'])
                elif payload_seg['service_type'] == 'ogcWms':
                    replace_if_set(['scrape_only', 'recursive', 'legend_format', 'feature_info_format'])
                v2_node, v1_node = regparse.make_node(key, dbdata["request"], current_app.config)
                db.put_doc(key, payload[lang]["service_type"], dbdata["request"],
                           layer_config=v2_node, v1_config=v1_node)
        except Exception as e:
            msg = {'msg': 'Error: {0}'.format(e.message)}
            return Response(json.dumps(msg), mimetype='application/json', status=500)
        success = {"msg": "Updated", "key": key}
        return Response(json.dumps(success), mimetype='application/json', status=200)
コード例 #9
0
ファイル: retrieval.py プロジェクト: james-rae/rcs
    def get(self, lang, smallkeylist, sortarg=''):
        """
        A REST endpoint for fetching a single document from the doc store.

        :param lang: A two letter language code for the response
        :type lang: str
        :param smallkeylist: A comma separated string of short keys each of which identifies a single dataset
        :type smallkeylist: str
        :param sortargs: 'sort' if returned list should be sorted based on geometry
        :type sortargs: str
        :returns: list -- an array of JSON configuration fragments
        (empty error objects are added where keys do not match)
        """
        keys = [x.strip() for x in smallkeylist.split(',')]
        unsorted_docs = [db.get_doc(smallkey, lang, self.version) for smallkey in keys]
        if sortarg == 'sort':
            # used to retrieve geometryType
            dbdata = [db.get_raw(smallkey) for smallkey in keys]
            lines = []
            polys = []
            points = []
            for rawdata, doc in zip(dbdata, unsorted_docs):
                # Point
                if rawdata["data"]["en"]["geometryType"] == "esriGeometryPoint":
                    points.append(doc)
                # Polygon
                elif rawdata["data"]["en"]["geometryType"] == "esriGeometryPolygon":
                    polys.append(doc)
                # Line
                else:
                    lines.append(doc)
            # Concat lists (first in docs = bottom of layer list)
            docs = polys + lines + points
        else:
            docs = unsorted_docs
        return Response(json.dumps(docs), mimetype='application/json')