Introducción al desarrollo de extensiones para CKAN

Desarrollando una extensión para CKAN desde cero
Solucionex
11
Ene 24

CKAN es una herramienta de gestión de datos abiertos, open source, utilizada por multitud de administraciones gubernamentales para el almacenamiento y la distribución de sus conjuntos de datos dentro del paradigma Open Data.

Pese a que es una herramienta muy popular utilizada en el ámbito de los datos abiertos y su optimización es palpable versión tras versión, como desarrollador, pienso que su curva inicial de aprendizaje es bastante compleja debido a la poca documentación y recursos disponibles. Esto, unido a que el desarrollo de extensiones por parte de la comunidad está poco dirigido por la empresa mantenedora del proyecto (Open Knowledge Foundation), hace que a la hora de implementar soluciones con esta herramienta, sea muy común encontrarse con la problemática de necesitar ciertas funcionalidades extras, algunas cubiertas por extensiones ya existentes, pero dirigidas a versiones obsoletas que tendrás que parchear, actualizar, o directamente volver a desarrollar desde cero.

Por ello vamos a hacer una pequeña introducción que nos permita tener un mapa mental para poder acceder de manera más cómoda al desarrollo de un extensión para esta herramienta.

👨🏻‍🏫 Breve introducción a CKAN

Como he dicho anteriormente, CKAN se trata de un gestor de datos abiertos que nos permite manipular las siguientes entidades:

  • Conjuntos de datos: Son las fichas que recogen información y metadatos relacionados con los datos.
  • Recursos: Son los archivos que recogen los datos.
  • Organizaciones: Entidad que nos permite la agrupación de conjuntos de datos según la empresa, administración o institución responsable de los mismos.
  • Grupos: Entidad que nos permite la agrupación de conjunto de datos, normalmente se utiliza para agrupar a los datos según su categoría: Economía, Medio ambiente, Tráfico, etc.

Además de las entidades principales, CKAN incluye una serie de extensiones en su núcleo, que no permitirá activar para ganar estas funcionalidades en el caso que las necesitemos, como son:

  • El registro de actividad de usuario (activity)
  • La lectura, carga y almacenamiento de los datos de los recursos que subamos para su acceso vía API (datastore, datapusher)
  • La presentación de los datos de los recursos en diferentes tipos de vistas (datatablesview, textview, videoview, webpageview, imageview)
  • La generación de estadísticas de uso (tracking, stats)
  • Uso multidioma del portal (multilingual)

Por último, aunque no incluidas en el núcleo de la herramienta, pero mantenidas por el equipo principal, tenemos extensiones como:

  • ckanext-scheming: Permite la personalización de las fichas (schemas) de información y metadatos de un conjunto de datos.
  • ckanext-dcat: Permite exponer el catálogo de datos en formato RDF siguiendo el estándar de vocabulario de datos DCAT.
  • ckanext-xloader: Nos permite reemplazar el cargador de datos por defecto que trae CKAN, datapusher, por uno más óptimo.
  • ckanext-geoview: Añade la posibilidad de utilizar vistas diseñadas para datos geolocalizados.
  • ckanext-harvest: Permite la recolección de repositorios de datos remotos.
  • ckanext-spatial: Otra extensión relacionada con datos geolocalizados.
  • ckanext-googleanalytics: Integración con Google Analytics.
  • ckanext-pages: Permite crear páginas con contenido personalizado.
  • ckanext-archiver: Permite añadir funcionalidades extra de descarga en los recursos de datos.
  • ckanext-hierarchy: Permite añadir jerarquía entre organizaciones.

Si te interesa saber más sobre CKAN y los Datos Abiertos puedes echarle un ojo al siguiente artículo.

🛠️ Preparar nuestro entorno de desarrollo

Hay varias formas de montar un entorno CKAN, personalmente, la opción que prefiero es la de crearme mi propio Dockerfile siguiendo los pasos de la documentación oficial, para así poder tener un mayor conocimiento y control de la herramienta y sus dependencias. Pero si no te quieres complicar, la gente de CKAN ya te ofrece un proyecto Docker Compose con el que poder levantar una instancia sin apenas mucho lío.

🧱 Lanzar 'scaffolding' para generar una extensión base

Una vez tengamos levantado y configurado el entorno CKAN, haremos uso del comando ckan que nos permite vía CLI lanzar multitud de procesos internos. En este caso el que más nos interesa es el comando ckan generate que nos permitirá crear una extensión base con todo lo necesario para no perder tiempo en crear directorios, archivos de instalación, configuración, etc.

En el caso de estar utilizando el entorno Docker proporcionado por CKAN, ejecutaremos lo siguiente:

docker-compose exec -u ckan ckan ckan generate extension

Esto nos abrirá un asistente que nos irá preguntando una serie de detalles, al terminar, habrá creado la extensión en /RUTA_A_VENV_CKAN/src/ckanext/ckanext-miextension.

👷🏻 Estructura de una extensión

Con nuestra extensión base ya creada, vamos a entender la estructura de directorios a tener en cuenta:

En el directorio raíz de nuestra extensión ckanext-miextension tenemos los archivos de instalación y configuración de la propia extensión, por destacar alguno:

  • setup.py - Archivo de configuración de la extensión.
  • dev-requirements.txt - Archivo de dependencias de desarrollo
  • requirements.txt - Archivo de dependencias
  • test.ini - Archivo de configuración de testing

Dentro del directorio raíz, encontramos el directorio ckanext con el archivo __init__.py y el directorio miextension donde se aloja todo el código de la misma, veámoslo.

  • assets - Directorio destinado a los archivos estáticos gestionados con Webassets.
  • i18n - En el caso de la extensión necesite soporte multilingüe, aquí se almacenan los archivos de internacionalización y localización
  • logic - Directorio, opcional, destinado a la lógica de negocio personalizada, acciones de la API, validadores..., si hubiera.
  • lib - Directorio, también opcional, destinado a las bibliotecas o módulos auxiliares que la extensión pueda necesitar.
  • model - Directorio destinado a definir los modelos de datos, en el caso de que la extensión los requiera.
  • public - Contiene los archivos estáticos
  • templates - Directorio destinado a las plantillas Jinja2, en donde podemos añadir pero también sobrescribir o extender otras plantillas ya existentes.
  • tests - Directorio destinado a los tests de la extensión.
  • plugin.py - Aquí se definen las clases y cualquier hook o interfaz que la extensión implemente.

Más detalle sobre la creación de una nueva extensión en el siguiente enlace a la documentación.

🏗️ Instalar y activar una extensión

Para añadir una extensión a nuestra instancia de CKAN tenemos dos pasos:

  • Instalar la extensión bien con el comando python o bien con pip.
#Instalación de desarrollo.Ejecutar dentro del directorio raíz de la extensión
python setup.py develop
#Instalación de producción
pip install RUTA_A_VENV_CKAN/src/ckanext/ckanext-miextension
  • Una vez instalada, tenemos que agregar el nombre de la extensión a la variable ckan.plugins en el archivo de configuración ckan.ini y reiniciar la aplicación.

🗃️ Ejemplos

En el mismo repositorio de CKAN tenemos una serie de ejemplos que nos pueden servir como base de nuestra nueva extensión. Por otra parte, en un siguiente artículo, mostraré paso a paso cómo desarrollo una extensión de ejemplo.

 

 

Desarrollo
CKAN