def publish_ogc(self, package_id): ''' Publish dataset wms/wfs resources to geoserver ''' context = { 'user': u'admin', 'api_call_type' : u'paster', } result = { 'success': False, 'message': toolkit._("Not enough information to publish this resource.") } # set other api call parameters username = context.get("user", None) lat_field = u'LatDegree' lng_field = u'LongDegree' # get usgin csv resouce id pkg = toolkit.get_action('package_show')(context, {'id': package_id}) resources = pkg.get('resources', []) for resource in resources: #if resource['format'].lower() == 'csv': if "NGDS Tier 3 Data, csv format:".lower() in resource['name'].lower(): resource_id = u'' + resource['id'] break # get layer from package try: md_package = None extras = pkg.get('extras', []) for extra in extras: key = extra.get('key', None) if key == 'md_package': md_package = json.loads(extra.get('value')) break resourceDescription = md_package.get('resourceDescription', {}) layer_name = resourceDescription.get('usginContentModelLayer', resource_id) version = resourceDescription.get('usginContentModelVersion', None) # handle harvested datasets that do not have a md_package if layer_name == resource_id and version == None: usgin_tag = [] for tag in pkg['tags']: if tag['name'].startswith('usgincm:'): usgin_tag.append(tag['name']) for key,value in (get_meta_action.get_usgin_prefix()).iteritems(): if reduce(lambda v1,v2: v1 or v2, map(lambda v: v in usgin_tag[0].lower(), value[0].lower())): key_arr = key.split("+") break layer_name = key_arr[1] version = u'' + key_arr[2] except: print str(datetime.datetime.now()) + ' PUBLISH_OGC: ERROR, Could not get required API CALL parameters for dataset ' + package_id sys.stdout.flush() # generate a unique workspace_name # layer_uuid = str(uuid.uuid4()) # workspace_name = layer_uuid.replace('-','') + layer_name # for some reason geoserver publishing works with workspaces made up of letters ONLY layer_uuid = ''.join(random.choice(string.ascii_uppercase) for _ in range(32)) workspace_name = layer_uuid.replace('-','') + layer_name try: result = toolkit.get_action('geoserver_publish_ogc')(context, { 'package_id' : package_id, 'resource_id' : resource_id, 'workspace_name' : workspace_name, 'layer_name' : layer_name, 'username' : username, 'col_latitude' : lat_field, 'col_longitude' : lng_field, 'layer_version' : version}) print str(datetime.datetime.now()) + ' PUBLISH_OGC: Dataset ' + package_id + ' HAS been published to the GeoServer' sys.stdout.flush() except: print str(datetime.datetime.now()) + ' PUBLISH_OGC: ERROR, Dataset ' + package_id + ' has NOT published to the GeoServer' sys.stdout.flush()
def publish_ogc(self, package_id): ''' Publish dataset wms/wfs resources to geoserver ''' context = { 'user': u'admin', 'api_call_type': u'paster', } result = { 'success': False, 'message': toolkit._("Not enough information to publish this resource.") } # set other api call parameters username = context.get("user", None) lat_field = u'LatDegree' lng_field = u'LongDegree' # get usgin csv resouce id pkg = toolkit.get_action('package_show')(context, {'id': package_id}) resources = pkg.get('resources', []) for resource in resources: #if resource['format'].lower() == 'csv': if "NGDS Tier 3 Data, csv format".lower( ) in resource['name'].lower(): resource_id = u'' + resource['id'] break # get layer from package try: md_package = None extras = pkg.get('extras', []) for extra in extras: key = extra.get('key', None) if key == 'md_package': md_package = json.loads(extra.get('value')) break resourceDescription = md_package.get('resourceDescription', {}) layer_name = resourceDescription.get('usginContentModelLayer', resource_id) version = resourceDescription.get('usginContentModelVersion', None) # handle harvested datasets that do not have a md_package if layer_name == resource_id and version == None: usgin_tag = [] for tag in pkg['tags']: if tag['name'].startswith('usgincm:'): usgin_tag.append(tag['name'].lower()) key_arr = [] for key, value in ( get_meta_action.get_usgin_prefix()).iteritems(): value = [x.lower() for x in value] if reduce(lambda v1, v2: v1 or v2, map(lambda v: v in usgin_tag, value)): key_arr = key.split("+") break layer_name = key_arr[1] version = u'' + key_arr[2] except: print str( datetime.datetime.now() ) + ' PUBLISH_OGC: ERROR, Could not get required API CALL parameters for dataset ' + package_id sys.stdout.flush() # generate a unique workspace_name # layer_uuid = str(uuid.uuid4()) # workspace_name = layer_uuid.replace('-','') + layer_name # for some reason geoserver publishing works with workspaces made up of letters ONLY layer_uuid = ''.join( random.choice(string.ascii_uppercase) for _ in range(4)) workspace_name = layer_name + '-' + layer_uuid.replace('-', '') try: result = toolkit.get_action('geoserver_publish_ogc')( context, { 'package_id': package_id, 'resource_id': resource_id, 'workspace_name': workspace_name, 'layer_name': layer_name, 'username': username, 'col_latitude': lat_field, 'col_longitude': lng_field, 'layer_version': version }) print str( datetime.datetime.now() ) + ' PUBLISH_OGC: Dataset ' + package_id + ' HAS been published to the GeoServer' sys.stdout.flush() except: print str( datetime.datetime.now() ) + ' PUBLISH_OGC: ERROR, Dataset ' + package_id + ' has NOT published to the GeoServer' print str(datetime.datetime.now()) + ' Resource id ' + resource_id print str(datetime.datetime.now()) + ' workspace ' + workspace_name print str(datetime.datetime.now()) + ' Layer ' + layer_name print str(datetime.datetime.now()) + ' user ' + username print str(datetime.datetime.now()) + ' rest ' + context sys.stdout.flush()
def publishOGC(self): """ Publishes the resource content into Geoserver. """ if request.method != 'POST' or not request.is_xhr: return { 'success': False, 'message': toolkit._("Bad request - JSON Error: No request body data") } context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'auth_user_obj': c.userobj} data = clean_dict(unflatten(tuplize_dict(parse_params(request.params)))) result = {'success': False, 'message': toolkit._("Not enough information to publish this resource.") } resource_id = data.get("resource_id", None) username = context.get("user", None) package_id = data.get("package_id", None) lat_field = data.get("geoserver_lat_field", None) lng_field = data.get("geoserver_lng_field", None) state = data.get("geoserver_state_field", None) #get layer from package try: md_package = None pkg = toolkit.get_action('package_show')(context, {'id': package_id}) extras = pkg.get('extras', []) for extra in extras: key = extra.get('key', None) if key == 'md_package': md_package = json.loads(extra.get('value')) break resourceDescription = md_package.get('resourceDescription', {}) layer = resourceDescription.get('usginContentModelLayer', resource_id) version = resourceDescription.get('usginContentModelVersion', None) # handle harvested datasets that do not have a md_package if layer == resource_id and version == None: usgin_tag = [] for tag in pkg['tags']: if tag['name'].startswith('usgincm:'): usgin_tag.append(tag['name']) for key,value in (get_meta_action.get_usgin_prefix()).iteritems(): if reduce(lambda v1,v2: v1 or v2, map(lambda v: v in usgin_tag, value)): key_arr = key.split("+") break layer = key_arr[1] version = key_arr[2] except: return result layer_name = data.get("layer_name", layer) workspace_name = state+''+layer_name if None in [resource_id, layer_name, username, package_id, version, state]: return result try: result = toolkit.get_action('geoserver_publish_ogc')(context, {'package_id': package_id, 'resource_id': resource_id, 'workspace_name': workspace_name, 'layer_name': layer_name, 'username': username, 'col_latitude': lat_field, 'col_longitude': lng_field, 'layer_version': version}) except: return { 'success': False, 'message': toolkit._("An error occured while processing your request, please contact your administrator.") } return result