Skip to main content

Create custom extensions

Create reusable CKAN extensions for custom functionality.

Extension structure

Create new extension:

ckan generate extension --name myextension

Structure:

ckanext-myextension/
├── ckanext/
│ └── myextension/
│ ├── __init__.py
│ ├── plugin.py
│ └── templates/
├── setup.py
└── README.md

Implement plugin interface

Create plugin in plugin.py:

import ckan.plugins as plugins
import ckan.plugins.toolkit as toolkit

class MyExtensionPlugin(plugins.SingletonPlugin):
plugins.implements(plugins.IConfigurer)
plugins.implements(plugins.IPackageController)

def update_config(self, config):
toolkit.add_template_directory(config, 'templates')

def before_create(self, context, pkg_dict):
# Custom validation or processing
return pkg_dict

Register plugin

Add to setup.py:

entry_points='''
[ckan.plugins]
myextension=ckanext.myextension.plugin:MyExtensionPlugin
'''

Enable in CKAN config:

ckan.plugins = ... myextension

Testing extensions

Write tests:

from ckan.tests import helpers

class TestMyExtension(helpers.FunctionalTestBase):
def test_plugin_loaded(self):
assert 'myextension' in helpers.plugins()

Run tests:

pytest ckanext/myextension/tests/

See Test CKAN for more testing guidance.