Extension ONDC


Extension Basics

Title
ONDC
Name
ckanext-ondc
Type
Public extension
Description
Standardizes and facilitates integration of ONDC (Office of National Data Commissioner) metadata attributes for Australian Government data
CKAN versions

~2.9, ~2.10, ~2.11

Show details
Download-Url (zip)
Download-Url commit date
2024-03-27
Url to repo
Category
Data Management & Quality


Background Infos

Description (long)
Show details

The ondc extension is designed to standardize and facilitate the integration of ONDC metadata attributes across CKAN portals, enabling seamless import/export of datasets with uniformity and compatibility according to ONDC guidelines. ONDC developed 26 metadata attributes as a baseline standard for discoverability and reusability of data assets across the Australian Government: 10 core attributes (mandatory for Australian Government Data Catalogue) and 16 additional attributes. The extension provides a complete set of ONDC presets that can be used with ckanext-scheming or directly via IDatasetForm interface. Features include ondc_package_show action to export ONDC attributes, ondc_package_search for searching by ONDC attributes, and standard CKAN actions (package_create, package_update, package_patch) support ONDC fields. Includes example plugin (ondc_dataset_example) demonstrating implementation without scheming.

Version
1.0.0
Version release date
2024-03-27
Contact name
DataShades
Contakt email
Contact Url
(not set)


Installation Guide

Configuration hints

Requirements: - Optional: ckanext-scheming for preset-based schema definition

Installation: 1. Activate CKAN virtualenv 2. Clone and install: git clone https://github.com/Data/datashades/ckanext-ondc.git cd ckanext-ondc pip install -e . pip install -r requirements.txt

Add to ckan.plugins: ondc

With ckanext-scheming:

Add ONDC presets to scheming

scheming.presets = ckanext.ondc:presets.yaml

Add dataset schema using ONDC presets

scheming.dataset_schemas = path_to_your_extension:dataset.yaml

Example schema: scheming_version: 1 dataset_type: your_dataset_type

dataset_fields: - preset: ondc_identifier - preset: ondc_title - preset: ondc_description - preset: ondc_data_custodian # … all 26 ONDC presets available

ONDC Metadata Attributes (26 total):

Core (10 mandatory): - identifier, title, description, data_custodian, point_of_contact - access_rights, security_classification, keyword, resource_type, date_modified

Additional (16 optional): - access_url, temporal_coverage_from/to, update_frequency, publish_date - purpose, location, sensitive_data, file_size, format, language - legal_authority, licence, disposal, data_status, publisher

Without scheming (IDatasetForm): Implement plugin with IDatasetForm interface, define schema with validators: - ondc_length_validator for field length limits - convert_to_extras/convert_from_extras for storage

Example plugin included: ckan.plugins = ondc ondc_dataset_example

API Actions:

Export ONDC attributes only

ckanapi action ondc_package_show id=

Search by ONDC attributes

ckanapi action ondc_package_search q=

Create/update with ONDC fields

ckanapi action package_create name= identifier= title= … ckanapi action package_update id=<id> identifier=<new-id> … ckanapi action package_patch id=<id> identifier=<new-id></p> <p>Documentation: - ONDC Guide: https://www.datacommissioner.gov.au/sites/default/files/2023-12/ONDC-Guide-on-Metadata-Attributes-November-23.pdf - Dataset schema example: https://github.com/DataShades/ckanext-ondc/blob/master/ckanext/ondc/dataset.yaml</p> <p>Testing: pytest –ckan-ini=test.ini</p> </div> <div class="kv-form-attribute" style="display:none"><div class="highlight-addon field-extension-config_hints"> <div><input type="text" id="extension-config_hints" class="form-control" name="Extension[config_hints]" value="Requirements: - Optional: ckanext-scheming for preset-based schema definition Installation: 1. Activate CKAN virtualenv 2. Clone and install: git clone https://github.com/Data/datashades/ckanext-ondc.git cd ckanext-ondc pip install -e . pip install -r requirements.txt Add to ckan.plugins: ondc With ckanext-scheming: # Add ONDC presets to scheming scheming.presets = ckanext.ondc:presets.yaml # Add dataset schema using ONDC presets scheming.dataset_schemas = path_to_your_extension:dataset.yaml Example schema: scheming_version: 1 dataset_type: your_dataset_type dataset_fields: - preset: ondc_identifier - preset: ondc_title - preset: ondc_description - preset: ondc_data_custodian # ... all 26 ONDC presets available ONDC Metadata Attributes (26 total): Core (10 mandatory): - identifier, title, description, data_custodian, point_of_contact - access_rights, security_classification, keyword, resource_type, date_modified Additional (16 optional): - access_url, temporal_coverage_from/to, update_frequency, publish_date - purpose, location, sensitive_data, file_size, format, language - legal_authority, licence, disposal, data_status, publisher Without scheming (IDatasetForm): Implement plugin with IDatasetForm interface, define schema with validators: - ondc_length_validator for field length limits - convert_to_extras/convert_from_extras for storage Example plugin included: ckan.plugins = ondc ondc_dataset_example API Actions: # Export ONDC attributes only ckanapi action ondc_package_show id=<dataset-id> # Search by ONDC attributes ckanapi action ondc_package_search q=<query> # Create/update with ONDC fields ckanapi action package_create name=<name> identifier=<id> title=<title> ... ckanapi action package_update id=<id> identifier=<new-id> ... ckanapi action package_patch id=<id> identifier=<new-id> Documentation: - ONDC Guide: https://www.datacommissioner.gov.au/sites/default/files/2023-12/ONDC-Guide-on-Metadata-Attributes-November-23.pdf - Dataset schema example: https://github.com/DataShades/ckanext-ondc/blob/master/ckanext/ondc/dataset.yaml Testing: pytest --ckan-ini=test.ini"> <div class="invalid-feedback"></div> </div> </div></div></td></tr> <tr><th style="width: 20%; text-align: right; vertical-align: middle;">Plugins to configure (ckan.ini)</th> <td><div class="kv-attribute">ondc ondc_dataset_example</div> <div class="kv-form-attribute" style="display:none"><div class="highlight-addon field-extension-config_plugins"> <div><input type="text" id="extension-config_plugins" class="form-control" name="Extension[config_plugins]" value="ondc ondc_dataset_example"> <div class="invalid-feedback"></div> </div> </div></div></td></tr> <tr><th style="width: 20%; text-align: right; vertical-align: middle;">CKAN Settings (ckan.ini)</th> <td><div class="kv-attribute"><span class="not-set">(not set)</span></div> <div class="kv-form-attribute" style="display:none"><div class="highlight-addon field-extension-config_env_vars"> <div><input type="text" id="extension-config_env_vars" class="form-control" name="Extension[config_env_vars]"> <div class="invalid-feedback"></div> </div> </div></div></td></tr> <tr><th style="width: 20%; text-align: right; vertical-align: middle;">DB migration to be executed</th> <td><div class="kv-attribute"><span class="not-set">(not set)</span></div> <div class="kv-form-attribute" style="display:none"><div class="highlight-addon field-extension-config_dbmigrate"> <div><input type="text" id="extension-config_dbmigrate" class="form-control" name="Extension[config_dbmigrate]"> <div class="invalid-feedback"></div> </div> </div></div></td></tr></table></div></div></form></div> <a href="/extension"><< back to Extensions</a> </div> </div> </main> <footer id="footer" class="mt-auto py-3 bg-light"> <div class="container"> <div class="row text-muted"> <div class="col-md-6 text-center text-md-start"> © Ondics GmbH 2025 | <a href="/site/about#imprint">Imprint</a> | <a href="/site/about">About</a> | <a href="/site/login">Login</a> </div> </div> </div> </footer> <script src="/assets/4f1078e6/jquery.js"></script> <script src="/assets/4334f9cf/yii.js"></script> <script src="/assets/4334f9cf/yii.activeForm.js"></script> <script src="/assets/bf8b72e7/js/bootstrap.bundle.js"></script> <script src="/assets/54db1c27/js/activeform.js"></script> <script src="/assets/e5c1c43c/js/kv-detail-view.js"></script> <script src="/assets/a5a36886/js/bootstrap-dialog.js"></script> <script src="/assets/a5a36886/js/dialog-yii.js"></script> <script src="/assets/197035d0/js/kv-widgets.js"></script> <script src="/assets/4334f9cf/yii.validation.js"></script> <script>var _paq = window._paq = window._paq || []; _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//analyse.ondics.de/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '76']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })();</script> <script>jQuery(function ($) { var $el=jQuery("#w0 .kv-hint-special");if($el.length){$el.each(function(){$(this).activeFieldHint()});}kvBs4InitForm(); krajeeYiiConfirm('krajeeDialog'); jQuery&&jQuery.pjax&&(jQuery.pjax.defaults.maxCacheLength=0); jQuery("#w1-container").kvDetailView(kvDetailView_aed71dd6); jQuery("#w1-container").find("[data-toggle=tooltip]").tooltip(); jQuery('#w0').yiiActiveForm([{"id":"extension-title","name":"title","container":".field-extension-title","input":"#extension-title","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Title cannot be blank."});yii.validation.string(value, messages, {"message":"Title must be a string.","max":255,"tooLong":"Title should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-name","name":"name","container":".field-extension-name","input":"#extension-name","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Name cannot be blank."});yii.validation.string(value, messages, {"message":"Name must be a string.","max":255,"tooLong":"Name should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-description","name":"description","container":".field-extension-description","input":"#extension-description","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Description must be a string.","skipOnEmpty":1});}},{"id":"extension-ckan_versions","name":"ckan_versions","container":".field-extension-ckan_versions","input":"#extension-ckan_versions","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"CKAN versions cannot be blank."});yii.validation.string(value, messages, {"message":"CKAN versions must be a string.","max":255,"tooLong":"CKAN versions should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-url_zip","name":"url_zip","container":".field-extension-url_zip","input":"#extension-url_zip","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Download-Url (zip) must be a string.","max":255,"tooLong":"Download-Url (zip) should contain at most 255 characters.","skipOnEmpty":1});yii.validation.url(value, messages, {"pattern":/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,"message":"Download-Url (zip) is not a valid URL.","enableIDN":false,"skipOnEmpty":1});}},{"id":"extension-url_repo","name":"url_repo","container":".field-extension-url_repo","input":"#extension-url_repo","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Url to repo must be a string.","max":255,"tooLong":"Url to repo should contain at most 255 characters.","skipOnEmpty":1});yii.validation.url(value, messages, {"pattern":/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,"message":"Url to repo is not a valid URL.","enableIDN":false,"skipOnEmpty":1});}}], []); var $el=jQuery("#w3 .kv-hint-special");if($el.length){$el.each(function(){$(this).activeFieldHint()});}kvBs4InitForm(); jQuery("#w4-container").kvDetailView(kvDetailView_aed71dd6); jQuery("#w4-container").find("[data-toggle=tooltip]").tooltip(); jQuery('#w3').yiiActiveForm([{"id":"extension-description_long","name":"description_long","container":".field-extension-description_long","input":"#extension-description_long","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Description (long) must be a string.","skipOnEmpty":1});}},{"id":"extension-version","name":"version","container":".field-extension-version","input":"#extension-version","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Version must be a string.","max":255,"tooLong":"Version should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-contact_name","name":"contact_name","container":".field-extension-contact_name","input":"#extension-contact_name","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Contact name must be a string.","skipOnEmpty":1});}},{"id":"extension-contakt_email","name":"contakt_email","container":".field-extension-contakt_email","input":"#extension-contakt_email","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Contakt email must be a string.","max":255,"tooLong":"Contakt email should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-contact_url","name":"contact_url","container":".field-extension-contact_url","input":"#extension-contact_url","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Contact Url must be a string.","skipOnEmpty":1});yii.validation.url(value, messages, {"pattern":/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,"message":"Contact Url is not a valid URL.","enableIDN":false,"skipOnEmpty":1});}}], []); var $el=jQuery("#w6 .kv-hint-special");if($el.length){$el.each(function(){$(this).activeFieldHint()});}kvBs4InitForm(); jQuery("#w7-container").kvDetailView(kvDetailView_aed71dd6); jQuery("#w7-container").find("[data-toggle=tooltip]").tooltip(); jQuery('#w6').yiiActiveForm([{"id":"extension-config_hints","name":"config_hints","container":".field-extension-config_hints","input":"#extension-config_hints","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Configuration hints must be a string.","skipOnEmpty":1});}},{"id":"extension-config_plugins","name":"config_plugins","container":".field-extension-config_plugins","input":"#extension-config_plugins","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Plugins to configure (ckan.ini) must be a string.","skipOnEmpty":1});yii.validation.string(value, messages, {"message":"Plugins to configure (ckan.ini) must be a string.","max":255,"tooLong":"Plugins to configure (ckan.ini) should contain at most 255 characters.","skipOnEmpty":1});}},{"id":"extension-config_env_vars","name":"config_env_vars","container":".field-extension-config_env_vars","input":"#extension-config_env_vars","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"CKAN Settings (ckan.ini) must be a string.","skipOnEmpty":1});}},{"id":"extension-config_dbmigrate","name":"config_dbmigrate","container":".field-extension-config_dbmigrate","input":"#extension-config_dbmigrate","error":".invalid-feedback","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"DB migration to be executed must be a string.","skipOnEmpty":1});yii.validation.string(value, messages, {"message":"DB migration to be executed must be a string.","max":255,"tooLong":"DB migration to be executed should contain at most 255 characters.","skipOnEmpty":1});}}], []); });</script></body> </html>