From f80f15ccf2cb01acee0b124c2558df200b907957 Mon Sep 17 00:00:00 2001 From: David Sandberg Date: Wed, 29 May 2019 19:13:21 +0200 Subject: [PATCH] [#4766] Allow empty arrays and objects in json type fields with datastore_create Currently, adding an empty array or an empty object to a field of type json using datastore_create results in a validation error and status code 409. After this change, empty arrays and empty objects can be added to fields of type json. --- ckanext/datastore/backend/postgres.py | 2 +- ckanext/datastore/tests/test_create.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ckanext/datastore/backend/postgres.py b/ckanext/datastore/backend/postgres.py index 0ea18092dbc..987b079e973 100644 --- a/ckanext/datastore/backend/postgres.py +++ b/ckanext/datastore/backend/postgres.py @@ -1042,7 +1042,7 @@ def upsert_data(context, data_dict): row = [] for field in fields: value = record.get(field['id']) - if value and field['type'].lower() == 'nested': + if value is not None and field['type'].lower() == 'nested': # a tuple with an empty second value value = (json.dumps(value), '') row.append(value) diff --git a/ckanext/datastore/tests/test_create.py b/ckanext/datastore/tests/test_create.py index 27c0650e1b2..6879a20faa7 100644 --- a/ckanext/datastore/tests/test_create.py +++ b/ckanext/datastore/tests/test_create.py @@ -21,6 +21,32 @@ class TestDatastoreCreateNewTests(DatastoreFunctionalTestBase): + def test_create_works_with_empty_array_in_json_field(self): + package = factories.Dataset() + data = { + 'resource': { + 'package_id': package['id'] + }, + 'fields': [{'id': 'movie', 'type': 'text'}, + {'id': 'directors', 'type': 'json'}], + 'records': [{'movie': 'sideways', 'directors': []}] + } + result = helpers.call_action('datastore_create', **data) + assert result['resource_id'] is not None + + def test_create_works_with_empty_object_in_json_field(self): + package = factories.Dataset() + data = { + 'resource': { + 'package_id': package['id'] + }, + 'fields': [{'id': 'movie', 'type': 'text'}, + {'id': 'director', 'type': 'json'}], + 'records': [{'movie': 'sideways', 'director': {}}] + } + result = helpers.call_action('datastore_create', **data) + assert result['resource_id'] is not None + def test_create_creates_index_on_primary_key(self): package = factories.Dataset() data = {