Adds a contact form
by U.K. Natural History Museum


Travis Coveralls CKAN Python

A CKAN extension for adding popup contact forms to pages.


Borrows much of the contact form code from ckanext-surrey.

An example can be seen on the Natural History Museum’s Data Portal when clicking “Contact dataset curator.

This extension now includes Google’s reCAPTCHA for preventing spam submissions.


Path variables used below:

  • $INSTALL_FOLDER (i.e. where CKAN is installed), e.g. /usr/lib/ckan/default
  • $CONFIG_FILE, e.g. /etc/ckan/default/development.ini
  1. Clone the repository into the src folder:
git clone
  1. Activate the virtual env:
. $INSTALL_FOLDER/bin/activate
  1. Install the requirements from requirements.txt:
cd $INSTALL_FOLDER/src/ckanext-contact
pip install -r requirements.txt
  1. Run
cd $INSTALL_FOLDER/src/ckanext-contact
python develop
  1. Add ‘contact’ to the list of plugins in your $CONFIG_FILE:
ckan.plugins = ... contact


There are no settings that must be provided in your .ini config file, but there are some options:


Name Description Default Email address to submit to email_to Name of the recipient ckan.site_title Email subject for the submitted form 'Contact/Question from visitor' Whether to append a timestamp to the subject line false


Name Description Default API key for the reCAPTCHA service. False (i.e. disabled) API secret for the reCAPTCHA service. False (i.e. disabled) data-module-action for the form/button

Further Setup

To use reCAPTCHA, you must register a site with the Google reCAPTCHA service and add your API key and secret in the configuration.


Add the following HTML where you want the contact button to appear:

{% set params = {...} %}

<a class="btn btn-primary" data-module="modal-contact" data-module-template="" href="" title="">
    <i class="fas fa-envelope"></i>

{% resource 'ckanext-contact/main' %}

Where params is a dict with three entries: package_id, resource_id, record_id (all of which are optional).


Test coverage is currently extremely limited.

To run the tests in this extension, there is a Docker compose configuration available in this repository to make it easy.

To run the tests against ckan 2.9.x on Python3:

  1. Build the required images
docker-compose build
  1. Then run the tests. The root of the repository is mounted into the ckan container as a volume by the Docker compose configuration, so you should only need to rebuild the ckan image if you change the extension’s dependencies.
docker-compose run ckan

The ckan image uses the Dockerfile in the docker/ folder which is based on openknowledge/ckan-dev:2.9

Recent Activity