[ckan-dev] Datastore & filestore via API
    Eduardo Santos 
    eduardo.edusantos at gmail.com
       
    Tue Aug  7 13:45:44 UTC 2012
    
    
  
Hi Michele,
i've just writen a code to do exactly the same you are talking about. I'm
cleaning it up (removing client stuff) to publish it, but i can point you
some directions in the meantime.
Let's address to you problems individually:
2012/8/7 Michele Barbera <barbera at spaziodati.eu>
> 1) Create a new dataset via the API
>
Ok, if you did it already, we can just ignore it.
> 2) Create a new resource for this dataset and upload a zip file in the
> ckan-filestore (local)
>
I would break your code in two parts: create a new resource and upload a
zip file in filestore.
*Create a new resource*
You could use ckanclient extension to do this:
https://github.com/okfn/ckanclient
        # Get API user and website domain data
        user = get_action('get_site_user')({'model': model, 'ignore_auth':
True}, {})
        ckan_url = config.get('app:main','ckan.site_url').rstrip('/')
        # Ckan client data and api URL
        api_url = urlparse.urljoin(config.get('app:main','ckan.site_url'),
'api')
        ckan = ckanclient.CkanClient(
                                     base_location=api_url,
                                     api_key=user.get('apikey'),
                                     is_verbose=True,
                                    )
        # This dict will contain resource data
        metadata = dict()
        metadata['url'] = 'http://something'
        identifier = 'some_name'
        format = 'xml'
        # Describe
        resource_entity = {
                           'name' : identifier,
                           'url' : metadata['url'],
                           'format' : format,
                           'extras' : metadata
        }
        package_entity = ckan.package_entity_get(package_name)
        # Add resource as an element for package. It's the only way to save
        package_entity['resources'].append(resource_entity)
        # This will update the package in package_entity
        ckan.package_entity_put(package_entity)
*Store file*
*
*
To store file you will could use the ofs library. Take a look at this code:
https://github.com/eduardosan/ckanclient/blob/master/ckanclient/loaders/util.py
> 3) Create another resource for the same dataset and upload a CSV file into
> the ckan datastore
>
This should do the trick:
        # Authenticate and remove resource from system
        user = get_action('get_site_user')({'model': model, 'ignore_auth':
True}, {})
        api_url = urlparse.urljoin(config.get('app:main','ckan.site_url'),
'api')
        # Elastic search URL
        webstore_request_url = '%s/api/data/%s/%s' % (ckan_url,
self.package_name, identifier)
        client = DataStoreClient(webstore_request_url)
        # Convert data to Json format
        metadata['id'] = identifier
        post_data = json.dumps(metadata, ensure_ascii=False)
        headers = dict()
        headers['Authorization'] = user.get('apikey')
        client._headers = headers
        list_data = list()
        list_data.append(post_data)
        # Insert data on Elastic Search
        self.response = client.upsert(list_data)
You will need DatastoreClient to do so.
I hope it helps.
-- 
Eduardo Santos
Analista de Sistemas
http://www.eduardosan.com
http://twitter.com/eduardosan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.okfn.org/pipermail/ckan-dev/attachments/20120807/2debfd1e/attachment-0001.html>
    
    
More information about the ckan-dev
mailing list