Código fuente para pydatajson.federation

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Extensión de pydatajson para la federación de metadatos de datasets a través de la API de CKAN.
"""
from __future__ import print_function
from ckanapi import RemoteCKAN
from ckanapi.errors import NotFound
from .ckan_utils import map_dataset_to_package
import re


[documentos]def push_dataset_to_ckan(catalog, catalog_id, owner_org, dataset_origin_identifier, portal_url, apikey): """Escribe la metadata de un dataset en el portal pasado por parámetro. Args: catalog (DataJson): El catálogo de origen que contiene el dataset. catalog_id (str): El prefijo con el que va a preceder el id del dataset en catálogo destino. owner_org (str): La organización a la cual pertence el dataset. dataset_origin_identifier (str): El id del dataset que se va a federar. portal_url (str): La URL del portal CKAN de destino. apikey (str): La apikey de un usuario con los permisos que le permitan crear o actualizar el dataset. Returns: str: El id del dataset en el catálogo de destino. """ dataset = catalog.get_dataset(dataset_origin_identifier) ckan_portal = RemoteCKAN(portal_url, apikey=apikey) package = map_dataset_to_package(dataset, catalog_id) package['owner_org'] = owner_org # Create missing groups existing_groups = ckan_portal.call_action('group_list') dataset_groups = [re.sub(r'[^a-z-_]+', '', group.lower()) for group in dataset['superTheme']] new_groups = set(dataset_groups) - set(existing_groups) for new_group in new_groups: ckan_portal.call_action('group_create', {'name': new_group.lower()}) # Get license id if dataset.get('license'): license_list = ckan_portal.call_action('license_list') try: ckan_license = next(license_item for license_item in license_list if license_item['title'] == dataset['license'] or license_item['url'] == dataset['license']) package['license_id'] = ckan_license['id'] except StopIteration: package['license_id'] = 'notspecified' else: package['license_id'] = 'notspecified' try: pushed_package = ckan_portal.call_action('package_update', data_dict=package) except NotFound: pushed_package = ckan_portal.call_action('package_create', data_dict=package) ckan_portal.close() return pushed_package['id']