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()
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
    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