CINXE.COM
Taming Dynamic Data with Table Designer
<!DOCTYPE html> <html class="no-js" lang="en"> <head> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-8271754-21"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-8271754-21'); </script> <!-- PostHog analitics and events collector --> <script> !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); posthog.init('phc_zjhMXcYodTdsui69Src7Y133OnOx5tPmmR55K7qLFZv', {api_host: 'https://app.posthog.com', person_profiles: 'always'}) </script> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Taming Dynamic Data with Table Designer"> <meta name="twitter:description" content="Learn how CKAN's Table Designer simplifies publishing high-quality data over time with schema-first design, live data validation, and automated constraints, ensuring accurate, consistent, and user-friendly data management for time series and evolving datasets."> <meta name="twitter:image" content="https://ckan.org/media/images/27-Table_designer-02.original.png"> <meta property="og:url" content="http://ckan.org/blog/taming-dynamic-data-with-table-designer"> <meta property="og:title" content="Taming Dynamic Data with Table Designer"> <meta property="og:description" content="Learn how CKAN's Table Designer simplifies publishing high-quality data over time with schema-first design, live data validation, and automated constraints, ensuring accurate, consistent, and user-friendly data management for time series and evolving datasets."> <meta property="og:site_name" content="ckanorg"> <meta property="og:image" content="https://ckan.org/media/images/27-Table_designer-02.original.png"> <meta property="og:image:width" content="2501"> <meta property="og:image:height" content="1309"> <meta itemprop="url" content="http://ckan.org/blog/taming-dynamic-data-with-table-designer"> <meta itemprop="name" content="Taming Dynamic Data with Table Designer"> <meta itemprop="description" content="Learn how CKAN's Table Designer simplifies publishing high-quality data over time with schema-first design, live data validation, and automated constraints, ensuring accurate, consistent, and user-friendly data management for time series and evolving datasets."> <meta itemprop="image" content="https://ckan.org/media/images/27-Table_designer-02.original.png"> <title>Taming Dynamic Data with Table Designer</title> <meta name="description" content="Learn how CKAN's Table Designer simplifies publishing high-quality data over time with schema-first design, live data validation, and automated constraints, ensuring accurate, consistent, and user-friendly data management for time series and evolving datasets."> <meta name="keywords" content="bad data, high-quality data, data validation, ckan, ckan extension"> <link href="/static/css/main.css" rel="stylesheet"> <link rel="stylesheet" href="/static/css/slick.css"> <link rel="icon" href="/static/img/ckan.ico"> <link href="/static/css/jquery.fancybox.min.css" rel="stylesheet"> <link href="/static/css/slick-theme.css" rel="stylesheet"> <link href="/static/css/micromodal.css" rel="stylesheet" type="text/css"> <script>window.pipedriveLeadboosterConfig = {base: 'leadbooster-chat.pipedrive.com',companyId: 11632257,playbookUuid: '38318f40-245d-419a-a07f-264a99d52996',version: 2};(function () {var w = window;if (w.LeadBooster) {console.warn('LeadBooster already exists');} else {w.LeadBooster = {q: [],on: function (n, h) {this.q.push({ t: 'o', n: n, h: h });},trigger: function (n) {this.q.push({ t: 't', n: n });},};}})();</script><script src="https://leadbooster-chat.pipedrive.com/assets/loader.js" async></script> </head> <body> <div class="wrapper" id="wrap"> <main class="main"> <div id="loading-spinner"> </div> <header class="header"> <div class="header-holder"> <div class="container"> <div class="logo"> <a href="/"><img src="/static/img/ckan-dpg.svg" alt="Logotype" width="160" height="44"></a> </div> <nav class="nav justify-content-end"> <div class="nav-opener"><span></span></div> <div class="nav-drop"> <ul class="nav-menu"> <li > <a href="/" > Home </a> </li> <li > <a href="/features" > Features </a> </li> <li > <a href="/showcase" > Showcase </a> </li> <div class="dropdown"> <button onclick="clickDropdown('Solutions')" id="dropbtn-Solutions" >Solutions <span class="support-arrow"></span></button> <div id="Solutions_dropdown" class="dropdown-content"> <a href="/government">CKAN for Government</a> <a href="/enterprise">CKAN for Enterprise</a> </div> </div> <div class="dropdown"> <button onclick="clickDropdown('Support')" id="dropbtn-Support" >Support <span class="support-arrow"></span></button> <div id="Support_dropdown" class="dropdown-content"> <a href="/community">Community Support</a> <a href="/commercial">Commercial Support</a> </div> </div> <li class="active" > <a href="/blog" > Blog </a> </li> <li > <a href="/events" > Events </a> </li> <li > <a href="/faq" > FAQ </a> </li> <li > <a href="https://docs.ckan.org/" target="_blank" > Docs <svg width="16" height="16" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 9.64368V13.6437C12 13.997 11.8595 14.3364 11.6095 14.5865C11.3594 14.8365 11.0203 14.977 10.6667 14.977H3.33333C2.97971 14.977 2.64057 14.8365 2.39052 14.5865C2.14048 14.3364 2 13.9973 2 13.6437V6.31035C2 5.95672 2.14048 5.61759 2.39052 5.36754C2.64057 5.11749 2.97971 4.97701 3.33333 4.97701H7.33333" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 2.97701H14V6.97701" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.6665 10.3103L13.9998 2.97701" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </a> </li> <li > <a href="https://github.com/ckan/ckan" target="_blank" class="btn btn-sm btn-grey btn-link" > <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.20235 0.977013C3.67055 0.977013 0 4.64756 0 9.17936C0 12.8089 2.34792 15.8745 5.60836 16.9613C6.01847 17.0331 6.17227 16.787 6.17227 16.5717C6.17227 16.3769 6.16202 15.731 6.16202 15.044C4.10118 15.4234 3.56802 14.5416 3.40398 14.0803C3.3117 13.8444 2.91183 13.1165 2.56323 12.9217C2.27615 12.7679 1.86603 12.3885 2.55298 12.3783C3.19892 12.368 3.6603 12.9729 3.81409 13.219C4.5523 14.4596 5.73139 14.111 6.20303 13.8957C6.2748 13.3626 6.49011 13.0037 6.72593 12.7986C4.9009 12.5936 2.99386 11.8861 2.99386 8.74874C2.99386 7.85673 3.3117 7.11852 3.8346 6.54436C3.75258 6.3393 3.46549 5.49856 3.91662 4.37074C3.91662 4.37074 4.60357 4.15542 6.17227 5.21148C6.82846 5.02692 7.52566 4.93465 8.22286 4.93465C8.92006 4.93465 9.61726 5.02692 10.2734 5.21148C11.8421 4.14517 12.5291 4.37074 12.5291 4.37074C12.9802 5.49856 12.6931 6.3393 12.6111 6.54436C13.134 7.11852 13.4519 7.84648 13.4519 8.74874C13.4519 11.8964 11.5346 12.5936 9.70953 12.7986C10.0069 13.055 10.2632 13.5471 10.2632 14.3161C10.2632 15.4131 10.2529 16.2949 10.2529 16.5717C10.2529 16.787 10.4067 17.0434 10.8168 16.9613C12.4452 16.4116 13.8601 15.3651 14.8625 13.9691C15.8649 12.5732 16.4043 10.898 16.4047 9.17936C16.4047 4.64756 12.7341 0.977013 8.20235 0.977013Z" fill="#333333"/></svg> View on Github </a> </li> <li> <a href="/accounts/login/">Login</a> </li> </ul> </div> </nav> </div> </div> </header> <section class="section-banner"> <div class="container-sm t-center"> <a href="/blog" class="link">Blog <svg width="8" height="13" viewBox="0 0 8 13" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path d="M2.00009 0.855957L0.590088 2.26596L5.17009 6.85596L0.590088 11.446L2.00009 12.856L8.00009 6.85596L2.00009 0.855957Z" fill="currentColor"/> </svg> </a> <h1>Taming Dynamic Data with Table Designer</h1> <p> CKAN 2.11 introduces Table Designer: form builder and enforced validation for your data </p> <ul class="article-bread-crumbs"> <li> <a href="/blog/author/ian.ward" title="Author: Ian Ward
Email: ian@excess.org
Company: Link Digital"> Ian Ward </a> </li> <li> <a href="/blog/tag/data-validation">data validation, </a> <a href="/blog/tag/data-quality">data quality, </a> <a href="/blog/tag/new-feature">new feature</a> </li> <li>23 Sep 2024</li> <li> <div class="share-container"> <div class="front"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-share-fill" viewBox="0 0 16 16"> <path d="M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.499 2.499 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5z"/> </svg> Share </div> <div class="back"> <div class="twitter"> <a href="https://twitter.com/intent/tweet?text=CKAN:%20News,%20industry%20reports,%20and%20announcements&url=https://ckan.org/blog/taming-dynamic-data-with-table-designer" target="_blank" rel="noopener" title="Tweet this"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="#fff" class="bi bi-twitter" viewBox="0 0 16 16"> <path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z"/> </svg> </a> </div> <div class="facebook"> <a href="https://www.facebook.com/sharer/sharer.php?u=https://ckan.org/blog/taming-dynamic-data-with-table-designer" target="_blank" rel="noopener" title="Share via Facebook"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="#fff" class="bi bi-facebook" viewBox="0 0 16 16"> <path d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z"/> </svg> </a> </div> <div class="linkedin"> <a href="https://www.linkedin.com/sharing/share-offsite/?url=https://ckan.org/blog/taming-dynamic-data-with-table-designer" target="_blank" rel="noopener" title="Share via LinkedIn"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="#fff" class="bi bi-linkedin" viewBox="0 0 16 16"> <path d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854V1.146zm4.943 12.248V6.169H2.542v7.225h2.401zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248-.822 0-1.359.54-1.359 1.248 0 .694.521 1.248 1.327 1.248h.016zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016a5.54 5.54 0 0 1 .016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225h2.4z"/> </svg> </a> </div> </div> </div> </li> </ul> </div> <img src="/media/images/27-Table_designer-01.2e16d0ba.fill-1440x600.png" alt="27-Table designer-01"> </section> <div class="container-sm article blog-event"> <p data-block-key="8926v">Publishing high-quality data is hard.</p><ul><li data-block-key="s834">Data schemas, custom rules, and enforced validation help</li></ul><p data-block-key="9scbk">Publishing high-quality data over time is <i>much harder</i>.</p><ul><li data-block-key="abtlo">Data collected changes</li><li data-block-key="63ss5">Validation rules change</li><li data-block-key="77p6v">Publishers and tools producing the data change</li><li data-block-key="736r3">The way we use the data changes</li><li data-block-key="e8l7">We want use old data and new data together</li></ul><p data-block-key="df2ra">In CKAN, time series data and regularly updated data is often published as a new CSV or Excel file every release, either replacing an existing file or being added to a growing collection.</p><p data-block-key="bsdl4">When publishing separate files with CKAN we can use <a href="https://github.com/ckan/ckanext-validation">ckanext-validation</a> to check our data against a <a href="https://json-schema.org/">JSON schema</a> but this requires someone checking the reports and fixing errors when they are found. Also, JSON schema is technical and difficult for many users and has limited validation rules.</p><p data-block-key="4736s">Even <i>with</i> validation, separate files are a challenge for users. For time series data every user first cleans and combines all files themselves, hoping that each release is compatible with the last so they have time left to do their actual work. For frequently updated data the file format or structure might have changed leaving users’ existing tools broken or needing continuous maintenance.</p> <h2 data-block-key="8926v">Table Designer is Schema-First</h2><p data-block-key="9th8n">Instead of flagging bad data after it’s uploaded, Table Designer rejects bad data as it’s uploaded (or even before it’s uploaded). So the first step in creating a Table Designer resource is to <i>design your table:</i></p><img alt="Table Designer field types" class="richtext-image left" height="590" src="/media/images/tdb1_AtJ8KU8.width-500.png" width="500"><p data-block-key="6b29c">Create fields with standard types and constraints, or even your own <a href="https://docs.ckan.org/en/2.11/extensions/custom-columns-constraints.html#custom-columns-constraints">custom types</a>, using this web form. Set constraints like minimum, maximum, and required fields. Add a list of choices to choice fields. Choose primary key fields, values that are guaranteed unique across the table. Provide friendly labels and helpful descriptions for each field.</p><p data-block-key="93vls">Table Designer creates an empty table for your data in the <a href="https://docs.ckan.org/en/2.11/maintaining/datastore.html">DataStore</a> database with your types and constraints applied. Your labels, descriptions, and constraints are published in the Data Dictionary.</p><p data-block-key="b9jr7">As an example, here are fields for collecting municipal bicycle counter time-series data. We want to publish daily counts from each location so we use a date and location as the primary key:</p><img alt="Table Designer Data Dictionary" class="richtext-image full-width" height="848" src="/media/images/tdb2_dem0KBy.width-800.png" width="800"><p data-block-key="3n9k4">The DataStore database guarantees uniqueness for primary keys. Range and any other custom constraints are implemented as database triggers, ensuring that only valid data will be accepted, and invalid data is rejected with helpful instructions.</p> <h2 data-block-key="igeyt">Live Validation in a Spreadsheet</h2><p data-block-key="8rnju">With our table created we have a few options for loading data. We can use <a href="https://docs.ckan.org/en/2.11/maintaining/table-designer.html#creating-and-updating-rows-with-ckanext-excelforms">ckanext-excelforms</a> to generate a template spreadsheet for loading up to a few thousand records at a time. This template may be used with Excel, Google Docs, LibreOffice etc. to paste in data from another source and it immediately reports on data errors <i>before uploading</i>.</p><p data-block-key="ac3dq">Data types, custom constraints, required fields, and duplicate primary keys are all checked in the template spreadsheet and highlighted for the user. Choice fields are provided as drop-down choice lists. Errors are shown in red, missing required fields are shown in blue:</p><img alt="ckanext-excelforms Error Validation" class="richtext-image full-width" height="702" src="/media/images/tdb3.width-800.png" width="800"><p data-block-key="5j2oo">The template spreadsheet also includes a copy of the Data Dictionary in a “reference” tab. Clicking on a field heading takes users directly to the description for that field with a description of its validation rules:</p><img alt="ckanext-excelforms Reference Tab" class="richtext-image full-width" height="612" src="/media/images/tdb4.width-800.png" width="800"><p data-block-key="4idpf">These template spreadsheets let data experts use a familiar tool to collect, combine, and clean up data before it’s published.</p><p data-block-key="faem5">Once errors are corrected and data is uploaded, Table Designer presents the data in a <a href="https://docs.ckan.org/en/2.11/maintaining/data-viewer.html#datatables-view">DataTables view</a> where it can be sorted, searched, and filtered. Rows can also be selected for editing and downloaded as pre-filled spreadsheet templates when updates are required:</p><img alt="DataTables Table Designer search and select" class="richtext-image full-width" height="416" src="/media/images/tdb5.width-800.png" width="800"><p data-block-key="667go"></p> <h2 data-block-key="igeyt">Auto-generated Forms</h2><p data-block-key="6u511">Simple things should be easy too! If we want to add, edit or delete only a few rows of data Table Designer provides auto-generated web forms:</p><img alt="Table Designer Edit Form" class="richtext-image full-width" height="473" src="/media/images/tdb6.width-800.png" width="800"><p data-block-key="3g3fg">Data can be added, updated or deleted without leaving CKAN and is immediately available for users.</p> <h2 data-block-key="igeyt">Use Existing DataStore APIs</h2><p data-block-key="17m19">Table Designer is built on the CKAN DataStore so we can use the existing <a href="https://docs.ckan.org/en/2.11/maintaining/datastore.html#the-data-api">DataStore APIs</a> to create tables, update, retrieve and delete data.</p><p data-block-key="f1fk5">Table Designer automatically extends the generated API documentation on the resource page to include examples from real data and examples with updating and deleting. This helps encourage users to integrate with existing applications and eliminate manual (and error-prone!) data publishing steps.</p> <h2 data-block-key="igeyt">Tracking Changes</h2><p data-block-key="d0kpp">With many users contributing to the same published data it can be important to record a history of changes. Use CKAN’s activity plugin with <a href="https://docs.ckan.org/en/2.11/maintaining/table-designer.html#tracking-changes-with-ckanext-dsaudit">ckanext-dsaudit</a> to record insert, update and delete actions with data previews:</p><img alt="ckanext-dsaudit Inserted Records" class="richtext-image full-width" height="316" src="/media/images/tdb7.width-800.png" width="800"><p data-block-key="97f6c"></p> <h2 data-block-key="igeyt">Bringing it Together</h2><p data-block-key="1eea7">Regardless of how data is loaded: entered in a web form, pasted into Excel, or synchronized with DataStore APIs the same types and custom Table Designer constraints apply to guarantee high quality.</p><p data-block-key="9dvv">Standard types and constraints can even be extended to cover almost any business logic required with custom database types, trigger functions, and error messages.</p><p data-block-key="fa67f">As data schemas change fields can be added and removed, and data can be migrated more easily.</p><p data-block-key="e33j0">Publishing time series and dynamic data with Table Designer means users have access to all the data without needing to clean it first. Users can rely on the automatically published Data Dictionary and high-quality data for building new workflows and applications.</p><p data-block-key="93n7q">We are really excited about this new feature and look forward to seeing how it will be leveraged by users to improve their data publication workflows. If you have any questions or want to share how you are using Table Designer, reach out on the <a href="https://ckan.org/community">community channels</a>.</p> </div> <div class="more-posts-bottom"> <div class="container-md"> <div class="indent"> <div class="container-sm t-center"> <span class="upper">More posts</span> </div> </div> <div class="post"> <div class="post-img narrow"> <a href="/blog/enhancing-dcat-support-in-ckan-dcat-ap-v3-scheming-integration-and-more"> <img src="/media/images/28-DCAT-01.2e16d0ba.fill-520x390.png" alt="28-DCAT-01"> </a> </div> <div class="post-info"> <span class="date">In Category on 11 Oct 2024</span> <br> <a href="/blog/enhancing-dcat-support-in-ckan-dcat-ap-v3-scheming-integration-and-more"><h2 class="h2">Enhancing DCAT support in CKAN (DCAT-AP v3, scheming integration, and more)</h2></a> <p> A review of the recent developments in CKAN's DCAT support, and how you can get involved </p> </div> </div> <div class="post"> <div class="post-img narrow"> <a href="/blog/the-new-ckan-211-release-is-now-available"> <img src="/media/images/00-standard-BLOG.2e16d0ba.fill-520x390.png" alt="00-standard-BLOG"> </a> </div> <div class="post-info"> <span class="date">In Category on 21 Aug 2024</span> <br> <a href="/blog/the-new-ckan-211-release-is-now-available"><h2 class="h2">The new CKAN 2.11 release is now available</h2></a> <p> Packed with enhancements and fixes, this CKAN version is the most performant ever. </p> </div> </div> </div> <div class="container-md"> <div class="white-box between"> <h3 class="h3 mb0">Connect with CKAN</h3> <ul class="social bigger"> <li> <a href="https://twitter.com/ckanproject" target="_blank" rel="noopener"> <svg width="37" height="30" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19.688 1.89405C18.9636 2.2153 18.1851 2.43243 17.3681 2.53008C18.2021 2.03016 18.8425 1.23857 19.1441 0.295403C18.3637 0.758239 17.4992 1.0944 16.5791 1.27559C15.8423 0.490562 14.7925 0 13.6308 0C11.4 0 9.59144 1.8085 9.59144 4.03914C9.59144 4.35571 9.62724 4.66401 9.69608 4.95963C6.33906 4.79119 3.36278 3.18311 1.37058 0.739371C1.02289 1.33594 0.8237 2.0298 0.8237 2.77003C0.8237 4.17136 1.53686 5.4077 2.62067 6.13202C1.9585 6.11106 1.33572 5.92937 0.791077 5.62684C0.790789 5.64369 0.790789 5.66061 0.790789 5.67761C0.790789 7.63467 2.18311 9.26724 4.03093 9.63825C3.69196 9.73058 3.33513 9.77991 2.9667 9.77991C2.70644 9.77991 2.45338 9.75463 2.20681 9.70746C2.72077 11.3122 4.21248 12.48 5.98 12.5126C4.59761 13.5959 2.85594 14.2417 0.963552 14.2417C0.637543 14.2417 0.315999 14.2226 0 14.1853C1.78754 15.3313 3.91074 16 6.19179 16C13.6214 16 17.6841 9.84515 17.6841 4.50752C17.6841 4.33238 17.6802 4.15818 17.6725 3.98499C18.4616 3.4155 19.1465 2.70407 19.688 1.89405Z" fill="#777777"/> </svg> </a> </li> <li> <a href="https://www.youtube.com/channel/UCVeS3fHRae7BzXVn8wMcQVw" target="_blank" rel="noopener"> <svg width="41" height="28" viewBox="0 0 41 28" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M36.4535 0.846154C38.1715 1.30769 39.5304 2.66667 39.992 4.38462C40.8381 7.51282 40.8638 14 40.8638 14C40.8638 14 40.8638 20.5128 40.0176 23.6154C39.5561 25.3333 38.1971 26.6923 36.4791 27.1538C33.3766 28 20.8894 28 20.8894 28C20.8894 28 8.40222 28 5.29965 27.1538C3.58171 26.6923 2.22273 25.3333 1.76119 23.6154C0.915039 20.4872 0.915039 14 0.915039 14C0.915039 14 0.915039 7.51282 1.73555 4.41026C2.19709 2.69231 3.55606 1.33333 5.27401 0.871795C8.37658 0.025641 20.8638 0 20.8638 0C20.8638 0 33.3509 0 36.4535 0.846154ZM27.2482 13.9999L16.8893 19.9999V7.99987L27.2482 13.9999Z" fill="#333333"/> </svg> </a> </li> <li> <a href="https://www.linkedin.com/groups/6795833" target="_blank" rel="noopener"> <svg width="30" height="30" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M16.4954 14.4C16.4954 15.2828 15.7781 16 14.9046 16H2.27928C1.40572 16 0.688477 15.2828 0.688477 14.4V1.6C0.688477 0.717241 1.40572 0 2.27928 0H14.9046C15.7873 0 16.4954 0.717241 16.4954 1.6V14.4ZM5.82856 3.90806C5.82856 4.49656 5.39637 4.97472 4.67913 4.97472C4.00787 4.97472 3.57568 4.49656 3.57568 3.90806C3.57568 3.31036 4.02626 2.85059 4.71591 2.85059C5.39637 2.85059 5.81936 3.31036 5.82856 3.90806ZM3.63086 12.6529V5.81151H5.75499V12.6529H3.63086ZM6.97797 5.82072C7.00556 6.43682 7.03314 7.14486 7.03314 8.00004V12.6621H9.15728V8.71728C9.15728 8.52418 9.17567 8.32188 9.23085 8.18394C9.38717 7.78854 9.73659 7.38394 10.3251 7.38394C11.0975 7.38394 11.401 7.98165 11.401 8.86441V12.6621H13.5251V8.61613C13.5251 6.60233 12.4768 5.6644 11.0791 5.6644C9.9297 5.6644 9.24004 6.31728 8.96418 6.76785H8.9274L8.82625 5.82072H6.97797Z" fill="#777777"/> </svg> </a> </li> <li> <a href="https://github.com/ckan/ckan" target="_blank" rel="noopener"> <svg width="30" height="30" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M8.69747 0C4.16567 0 0.495117 3.67055 0.495117 8.20235C0.495117 11.8319 2.84304 14.8975 6.10347 15.9843C6.51359 16.0561 6.66739 15.81 6.66739 15.5947C6.66739 15.3999 6.65713 14.754 6.65713 14.067C4.59629 14.4464 4.06314 13.5646 3.89909 13.1033C3.80682 12.8674 3.40695 12.1395 3.05835 11.9447C2.77127 11.7909 2.36115 11.4115 3.0481 11.4013C3.69403 11.391 4.15542 11.9959 4.30921 12.242C5.04742 13.4826 6.22651 13.134 6.69814 12.9187C6.76992 12.3855 6.98523 12.0267 7.22104 11.8216C5.39602 11.6166 3.48898 10.9091 3.48898 7.77173C3.48898 6.87972 3.80682 6.14151 4.32972 5.56735C4.24769 5.36229 3.96061 4.52155 4.41174 3.39372C4.41174 3.39372 5.09869 3.17841 6.66739 4.23446C7.32357 4.04991 8.02077 3.95763 8.71797 3.95763C9.41517 3.95763 10.1124 4.04991 10.7686 4.23446C12.3373 3.16816 13.0242 3.39372 13.0242 3.39372C13.4753 4.52155 13.1883 5.36229 13.1062 5.56735C13.6291 6.14151 13.947 6.86947 13.947 7.77173C13.947 10.9194 12.0297 11.6166 10.2046 11.8216C10.502 12.078 10.7583 12.5701 10.7583 13.3391C10.7583 14.4361 10.7481 15.3179 10.7481 15.5947C10.7481 15.81 10.9018 16.0664 11.312 15.9843C12.9403 15.4346 14.3552 14.3881 15.3576 12.9921C16.36 11.5961 16.8994 9.92095 16.8998 8.20235C16.8998 3.67055 13.2293 0 8.69747 0Z" fill="#777777"/> </svg> </a> </li> </ul> </div> </div> </div> </main> <footer class="footer"> <div class="container-lg"> <div class="two-columns"> <div class="two-columns-item"> <span>CKAN stewards</span> <p>Datopian and Link Digital are co-stewards of the CKAN project and some of the longest standing contributors to CKAN. They both play key roles in ensuring the CKAN project thrives and delivers the best results for CKAN’s end users and stakeholders.</p> <ul> <li><a href="https://linkdigital.com.au/" target="_blank" rel="noopener"><img class="linkdigital-logo" src="/static/img/linkdigital-logo-footer.svg" alt="LinkDigital"></a></li> <li><a href="https://www.datopian.com/" target="_blank" rel="noopener"><img class="datopian-logo" src="/static/img/datopian-logo-footer.svg" alt="Datopian"></a></li> </ul> <span>Held in trust by</span> <p>CKAN assets are held in trust by <strong>Open Knowledge Foundation</strong>, a non-profit organization, with best practice policies on governing openly and for use of the trademark.</p> <ul> <li><a href="https://okfn.org/en/" target="_blank" rel="noopener"><img class="okfn-logo" src="/static/img/logo-okfn.png" alt="OpenKnowledge"></a></li> </ul> </div> <div class="two-columns-item social-container"> <span>Sign up for our newsletter</span> <p>Sign up to receive news and updates from CKAN. Your information will be used in accordance with our privacy policy. You may opt out at any time.</p> <div class="footer-subscribe"> <form action="#" id="subscribe_form"> <iframe src="/csrf/" style="display: none;"></iframe> <div class="row"> <input type="text" id="subscribe_name" name="name" placeholder="your name" autocomplete="off"/> <input type="text" id="subscribe_email" name="email" placeholder="your@email.com" autocomplete="off"/> <div class="g-recaptcha" data-sitekey="6LfTnUYlAAAAAEefHjCqXUTP0hGLIPaRu2vSBWNg" data-size="invisible"> </div> <input type="submit" value="Subscribe" class="btn btn-sm"/> </div> </form> </div> <span>Connect with us</span> <p>Join our vibrant community! Follow us on Twitter, LinkedIn, Gitter and GitHub for real-time updates, discussions and contributions.</p> <div class="footer-btns"> <ul class="auth-links"> <li> <a href="/accounts/login/">Login</a> </li> </ul> <ul class="social"> <li> <a href="https://twitter.com/ckanproject" target="_blank" rel="noopener"> <svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19.688 1.89405C18.9636 2.2153 18.1851 2.43243 17.3681 2.53008C18.2021 2.03016 18.8425 1.23857 19.1441 0.295403C18.3637 0.758239 17.4992 1.0944 16.5791 1.27559C15.8423 0.490562 14.7925 0 13.6308 0C11.4 0 9.59144 1.8085 9.59144 4.03914C9.59144 4.35571 9.62724 4.66401 9.69608 4.95963C6.33906 4.79119 3.36278 3.18311 1.37058 0.739371C1.02289 1.33594 0.8237 2.0298 0.8237 2.77003C0.8237 4.17136 1.53686 5.4077 2.62067 6.13202C1.9585 6.11106 1.33572 5.92937 0.791077 5.62684C0.790789 5.64369 0.790789 5.66061 0.790789 5.67761C0.790789 7.63467 2.18311 9.26724 4.03093 9.63825C3.69196 9.73058 3.33513 9.77991 2.9667 9.77991C2.70644 9.77991 2.45338 9.75463 2.20681 9.70746C2.72077 11.3122 4.21248 12.48 5.98 12.5126C4.59761 13.5959 2.85594 14.2417 0.963552 14.2417C0.637543 14.2417 0.315999 14.2226 0 14.1853C1.78754 15.3313 3.91074 16 6.19179 16C13.6214 16 17.6841 9.84515 17.6841 4.50752C17.6841 4.33238 17.6802 4.15818 17.6725 3.98499C18.4616 3.4155 19.1465 2.70407 19.688 1.89405Z" fill="#777777"></path> </svg> </a> </li> <li> <a href="https://www.linkedin.com/company/80804045" target="_blank" rel="noopener"> <svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M16.4954 14.4C16.4954 15.2828 15.7781 16 14.9046 16H2.27928C1.40572 16 0.688477 15.2828 0.688477 14.4V1.6C0.688477 0.717241 1.40572 0 2.27928 0H14.9046C15.7873 0 16.4954 0.717241 16.4954 1.6V14.4ZM5.82856 3.90806C5.82856 4.49656 5.39637 4.97472 4.67913 4.97472C4.00787 4.97472 3.57568 4.49656 3.57568 3.90806C3.57568 3.31036 4.02626 2.85059 4.71591 2.85059C5.39637 2.85059 5.81936 3.31036 5.82856 3.90806ZM3.63086 12.6529V5.81151H5.75499V12.6529H3.63086ZM6.97797 5.82072C7.00556 6.43682 7.03314 7.14486 7.03314 8.00004V12.6621H9.15728V8.71728C9.15728 8.52418 9.17567 8.32188 9.23085 8.18394C9.38717 7.78854 9.73659 7.38394 10.3251 7.38394C11.0975 7.38394 11.401 7.98165 11.401 8.86441V12.6621H13.5251V8.61613C13.5251 6.60233 12.4768 5.6644 11.0791 5.6644C9.9297 5.6644 9.24004 6.31728 8.96418 6.76785H8.9274L8.82625 5.82072H6.97797Z" fill="#777777"></path> </svg> </a> </li> <li> <a href="https://gitter.im/ckan/chat" target="_blank" rel="noopener"> <svg width="14" height="20" viewBox="0 0 14 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0 0H1.91947V12.6679H0V0ZM11.6699 3.07099H13.5893V12.6679H11.6699V3.07099ZM3.91557 3.07099H5.83489V20H3.91557V3.07099ZM7.75437 3.07099H9.67384V20H7.75437V3.07099Z" fill="#777777"></path></svg> </a> </li> <li> <iframe src="https://ghbtns.com/github-btn.html?user=ckan&repo=ckan&type=star&count=true&size=large" frameborder="0" scrolling="0" width="150" height="30" title="GitHub"></iframe> </li> </ul> </div> <span>We are here to assist</span> <p>Have questions or need support? Our team is ready to help you navigate and make the most of CKAN.</p> <script src="/static/js/jquery-3.5.1.min.js"></script> <div class="row"> <div class="col-xs-1 text-capitalize" align="center"> <a data-micromodal-trigger="modal-543396392" href="javascript:void(0);" id="contact">Contact Us</a> </div> </div> <div class="modal micromodal-slide" id="modal-543396392" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" id="modal-content" role="dialog" aria-modal="true" aria-labelledby="modal-1-title"> <header class="modal__header"> <h2 class="modal__title" id="modal-1-title"> Contact Us </h2> <button class="modal__close" aria-label="Close modal" data-micromodal-close></button> </header> <form action="/contact-us" method="POST" role="form" class="contact-modal" id="modal-form-213"> <main class="modal__content" id="modal-1-content"> <input type="hidden" name="csrfmiddlewaretoken" value="8okR5T8OnEb5kF6wuYnFKPAqTBgmqIexKXYi3pMKLyA1gJx8VpTw9eG4hxmYpsBd"> <div class="modal-intro"> <p data-block-key="jj22m"><i>Note: Your information will be used in accordance with our Privacy Policy. You may opt-out at any time.</i></p> </div> <p> <label for="id_your_e_mail_address">Your e-mail address</label> <input type="text" name="your_e_mail_address" maxlength="255" required id="id_your_e_mail_address"> </p> <p> <label for="id_your_name">Your name</label> <input type="text" name="your_name" maxlength="255" required id="id_your_name"> </p> <p> <label for="id_your_companyorganization_name">Your Company/Organization Name</label> <input type="text" name="your_companyorganization_name" maxlength="255" required id="id_your_companyorganization_name"> </p> <p> <label for="id_your_phone_number">Your phone number</label> <input type="text" name="your_phone_number" maxlength="255" id="id_your_phone_number"> </p> <p> <label for="id_how_you_heard_about_us">How did you hear about us?</label> <select name="how_you_heard_about_us" id="id_how_you_heard_about_us"> <option value="Search Engine" selected>Search Engine</option> <option value="CKAN Website">CKAN Website</option> <option value="AWS Marketplace">AWS Marketplace</option> <option value="Twitter">Twitter</option> <option value="LinkedIn">LinkedIn</option> <option value="FaceBook">FaceBook</option> <option value="Referral">Referral</option> <option value="Google Advertisement">Google Advertisement</option> <option value="Webinar">Webinar</option> <option value="YouTube">YouTube</option> <option value="Conference or Event">Conference or Event</option> <option value="Other">Other</option> </select> </p> <p> <label for="id_what_brings_you_to_ckanorg_how_can_we_help">What brings you to CKAN.org / How can we help?</label> <textarea name="what_brings_you_to_ckanorg_how_can_we_help" cols="40" rows="10" id="id_what_brings_you_to_ckanorg_how_can_we_help"> </textarea> </p> <p> <label for="id_i_consent_to_ckanorg_sending_me_marketing_emails_i_would_like_to_sign_up_to_receive_email_updates_from_ckanorg">I would like to sign up to receive emails with the latest news, events, and more from ckan.org.</label> <input type="checkbox" name="i_consent_to_ckanorg_sending_me_marketing_emails_i_would_like_to_sign_up_to_receive_email_updates_from_ckanorg" id="id_i_consent_to_ckanorg_sending_me_marketing_emails_i_would_like_to_sign_up_to_receive_email_updates_from_ckanorg"> </p> <p> <img src="/captcha/image/d8b5e30e74eaf3d88ff7f8505b0f13870aef8adb/" alt="captcha" class="captcha" /> <input type="hidden" name="wagtailcaptcha_0" value="d8b5e30e74eaf3d88ff7f8505b0f13870aef8adb" required id="id_wagtailcaptcha_0" autocomplete="off"><input type="text" name="wagtailcaptcha_1" required id="id_wagtailcaptcha_1" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false"> </p> <input name="source-page-id" type="hidden" value="399"> </main> <footer class="modal__footer"> <input id="message-text" type="hidden" value="<h4>Success!</h4> <p>Thank you for getting in touch with us! Your message has been successfully submitted, and we'll respond shortly. Stay tuned!</p>"> <button id="modal-btn-213" class="modal__btn" data-callback="onContactSubmit_213" data-action="submit" disabled> Submit </button> </footer> </form> </div> </div> </div> <script type="text/javascript"> $('a[id=contact]').on("click", function() { var modal_trigger = $(this).attr("data-micromodal-trigger"); var modal_window = $('#' + modal_trigger); var modal_form = modal_window.find("form"); var button = modal_form.find('.modal__btn'); var required = modal_form.find('input[required]:not([id="id_wagtailcaptcha"]), select[required], textarea[required]'); // check whether all required fields are fulfilled required.on('blur keyup change', function() { var all_required_filled = true; required.each(function() { if (!$(this).val()) { all_required_filled = false; }; }); if (all_required_filled) { button.prop("disabled", false).addClass("modal__btn-primary"); } else { button.prop("disabled", true).removeClass("modal__btn-primary"); }; }); }); $('.captcha').click(function () { $.getJSON("/captcha/refresh/", function (result) { $('.captcha').attr('src', result['image_url']); $('#id_captcha_0').val(result['key']) }); }); function onContactSubmit_213(token) { var id = "#modal-" + 213; var message = $(id).find('#message-text').val(); $(id).find(".contact-modal").submit(); $(id).find("#modal-content") .css("width", "100%") .html("<div style='text-align: center; padding: 30px 0px 30px 0px' id='thanks-text'>"+message+"</div>"); }; </script> </div> </div> </div> </footer> <div id="thanks-modal" class="modal"> <div class="modal-content"> <span class="close">×</span> <div id="thanks-text"></div> </div> </div> </div> <script src="/static/js/jquery-3.5.1.min.js"></script> <script src="/static/js/readmore.min.js"></script> <script src="/static/js/slick.min.js"></script> <script src="/static/js/jquery.fancybox.min.js"></script> <script src="/static/js/device.js"></script> <script src="/static/js/common.js"></script> <script src="/static/js/dropdown.js"></script> <script src="/static/js/micromodal.min.js"></script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <script> document.addEventListener("DOMContentLoaded", function() { MicroModal.init(); }); </script> <script src="/static/js/ckanorg.js"></script> </body> </html>