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)
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')
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)
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)
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
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
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
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)
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')