Writing CKAN
Extensions

A CKAN extension is a Python package that modifies or extends CKAN.

Install CKAN

from source

Activate your virtualenv

. /usr/lib/ckan/default/bin/activate

Change directory

cd /usr/lib/ckan/default/src

Create an empty extension

paster --plugin=ckan create
-t ckanext
ckanext-iauthfunctions

(all on one line)

ckanext-iauthfunctions/

    ckanext/
        __init__.py

        iauthfunctions/
            __init__.py

    ckanext_iauthfunctions.egg-info/
        ...
    setup.py

Each extension contains
one or more plugins that
provide the extension’s features.

Create a plugin

ckanext-iauthfunctions/
    ckanext/
        __init__.py
        iauthfunctions/
            __init__.py
        plugin.py
        ckanext_iauthfunctions.egg-info/
        setup.py
import ckan.plugins as plugins

class ExampleIAuthFunctionsPlugin(plugins.SingletonPlugin):
    pass

Install the extension

ckanext-iauthfunctions/
    ckanext/
        __init__.py
        iauthfunctions/
            __init__.py
        plugin.py
        ckanext_iauthfunctions.egg-info/
        setup.py
entry_points='''
  [ckan.plugins]
  iauthfunctions=ckanext.iauthfunctions.plugin:ExampleIAuthFunctionsPlugin
''',
    

Install the extension

. /usr/lib/ckan/default/bin/activate
cd /usr/lib/ckan/default/src/ckanext-iauthfunctions
python setup.py develop

Enable the plugin

ckan.plugins = stats text_preview recline_preview iauthfunctions

Run CKAN

paster serve /etc/ckan/default/development.ini
Starting server in PID 13961.
serving on 0.0.0.0:5000 view at http://127.0.0.1:5000

Implement a plugin interface

import ckan.plugins as plugins

class IAuthFunctions(Interface):
    '''Override CKAN's authorization functions, or add new ones.'''

    def get_auth_functions(self):
        '''Return the authorization functions provided by this plugin.

        Return a dictionary mapping authorization function names 
        (strings) to functions. For example::

            {'user_create': my_custom_user_create_function,
             'group_create': my_custom_group_create}

        '''

Implement a plugin interface

ckanext-iauthfunctions/
    ckanext/
        __init__.py
        iauthfunctions/
            __init__.py
        plugin.py
        ckanext_iauthfunctions.egg-info/
        setup.py

Implement a plugin interface

import ckan.plugins as plugins


def group_create(context, data_dict=None):
    return {'success': False,
            'msg': 'No one can create groups'}


class ExampleIAuthFunctionsPlugin(plugins.SingletonPlugin):
    plugins.implements(plugins.IAuthFunctions, inherit=False)

    def get_auth_functions(self):
        return {'group_create': group_create}

The plugins toolkit

import ckan.plugins.toolkit as toolkit

def group_create(context, data_dict=None):

    user_name = context['user']

    member_list = toolkit.get_action('member_list')
    members = member_list(
        data_dict={'id': 'curators', 'object_type': 'user'})
    member_ids = [member_tuple[0] for member_tuple in members]

    context['session'] = context['model'].Session

    convert_user_name_or_id_to_id = toolkit.get_converter(
            'convert_user_name_or_id_to_id')
    usr_id = convert_user_name_or_id_to_id(user_name, context)

    if usr_id in member_ids:
        return {'success': True}
    else:
        return {'success': False,
                'msg': 'Only curators can create groups'}

context

{
    "user": "seanh",
}

data_dict

{'description': u'A really cool group',
 'image_url': u'',
 'name': u'my_group',
 'title': u'My Group',
 'type': 'group',
 'users': [{'capacity': 'admin',
 'name': u'seanh'}]}