[ckan-dev] How to load Ckan configuration inside extension?

Sean Hammond sean.hammond at okfn.org
Wed Jul 11 10:54:03 UTC 2012


> Hi Sean,
> 
> Thank you for the answer. Yes, I've seen this extension, but I had very
> specific requirements and only a few time, and it would take me more
> time to know this extension than to develop a new one.
> 
> I'm going to share my code, but I don't know if it's going to be useful,
> because there's a lot of other extensions to achieve the same thing. I
> just can't release it now because there's a lot of client-specific
> things that would not only be broken, but it would also not fit any
> other environment. I'll move this code to another extension and release
> the other work. It basically does this:
> 
> 1 - Monitor one specific directory in the computer for changes using
> pyinotify;
> 2 - When there's a new file detected, send it to be processed;
> 3 - The file is a zip data collection with self contained data records,
> also zipped. A model very similar to ODF, but much more simple;
> 4 - Parse one RDF record inside the zip record and insert it into Ckan
> as a resource;
> 5 - Store resource metadata on Elastic Search;
> 6 - Store binary files in OFS;
> 7 - keep a log of all transactions, even parsing errors.
> 
> As you can see, it's really a lot of operations, and the code is still a
> mess, so I don't know if it's going to be useful.
> 
> Anyway, the problem persists. As the loading script run as a daemon, the
> only way I found to parse the .ini file is with the following code:
> 
> import ConfigParser
> config = ConfigParser.ConfigParser()
> 
> # Find config file
> config_file = os.environ.get('CKAN_CONFIG')
> if not config_file:
>      config_file =  os.path.join(
>           os.path.dirname(os.path.abspath(__file__)),
> '../../../ckan/development.ini')
> 
> config.read(config_file)
> 
> # Load DB connection
> from sqlalchemy import create_engine
> engine = create_engine(config.get('app:main','sqlalchemy.url'))
> model.metadata.bind = engine
> 
> I'm sure it's not the best implementation, and it would help me very
> much if you could point me a better way to do it.

Hi Eduardo, CKAN plugins can read and edit CKAN's configuration by
implementing the IConfigurer and/or IConfigurable plugin interfaces:

http://docs.ckan.org/en/ckan-1.7.1/writing-extensions.html

But that only helps if you're writing an extension, won't work for
standalone scripts.

You can implement your script as a CKAN extension (and run it from the
paster command) using CkanCommand, and this way you can import
pylons.config and access the config that way.  That's slightly better as
you don't have to write your own code to find and parse the config file.

For an example of implementing a CKAN paster command see:

https://github.com/seanh/ckanext-examplevocabs

The new command is registered in the extension's setup.py:

https://github.com/seanh/ckanext-examplevocabs/blob/master/setup.py#L29

and then is implemented in the VocabsCommand class:

https://github.com/seanh/ckanext-examplevocabs/blob/master/ckanext/examplevocabs/plugin.py#L11

This example doesn't actually read the CKAN config, but you could read
it by adding these lines to the command() method:

    import pylons.config
    self._load_config()
    site_title = pylons.config['ckan.site_title']

If your script really is a standalone script and not a CKAN extension at
all, then I'm not sure if anything would work other than finding and
parsing the ini file yourself with ConfigParser.




More information about the ckan-dev mailing list