Skip to content

Commit

Permalink
Don't store empty repeating subfields
Browse files Browse the repository at this point in the history
When implementing repeating subfields without any mandatory subfields,
if empty values are sent from the form an "empty" item is stored, with
all its properties empties:

```
{
    "name": "test-dataset",
    "publisher": [
        {
            "email": "",
            "name": "",
            "type": "",
        }
    ]
}
```

The changes in `expand_form_composite()` fix the issue on the scheming
side, preparing a `data_dict` with an empty list for that field:

```
{
    "name": "test-dataset",
    "publisher": []
}
```

Sadly, the navl functions drop the field entirely and it doesn't get
stored as an extra, so it's missing from the resulting dataset dict

```
{
    "name": "test-dataset",
}
```
  • Loading branch information
amercader committed Jun 20, 2024
1 parent 83a66ca commit 1d875c8
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
9 changes: 5 additions & 4 deletions ckanext/scheming/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -397,17 +397,18 @@ def expand_form_composite(data, fieldnames):
parts[1] = indexes[parts[1]]
try:
try:
comp[int(parts[1])]['-'.join(parts[2:])] = data[key]
del data[key]
if data[key]:
comp[int(parts[1])]['-'.join(parts[2:])] = data[key]
except IndexError:
comp.append({})
comp[int(parts[1])]['-'.join(parts[2:])] = data[key]
if data[key]:
comp[int(parts[1])]['-'.join(parts[2:])] = data[key]
finally:
del data[key]
except (IndexError, ValueError):
pass # best-effort only



class SchemingGroupsPlugin(p.SingletonPlugin, _GroupOrganizationMixin,
DefaultGroupForm, _SchemingMixin):
p.implements(p.IConfigurer)
Expand Down
20 changes: 20 additions & 0 deletions ckanext/scheming/tests/test_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,26 @@ def test_dataset_form_create(self, app, sysadmin_env):
assert dataset["citation"] == [{'originator': ['mei', 'ahmed']}]
assert dataset["contact_address"] == [{'address': 'anyplace'}]

def test_dataset_form_create_empty_subfields(self, app, sysadmin_env):
data = {"save": "", "_ckan_phase": 1}

data["name"] = "subfield_dataset_1"
data["citation-0-originator"] = ['mei', 'ahmed']
data["contact_address-0-address"] = 'anyplace'

data["publisher-0-name"] = ""
data["publisher-0-url"] = ""

url = '/test-subfields/new'
try:
app.post(url, environ_overrides=sysadmin_env, data=data, follow_redirects=False)
except TypeError:
app.post(url.encode('ascii'), params=data, extra_environ=sysadmin_env)

dataset = call_action("package_show", id="subfield_dataset_1")

assert "publisher" not in dataset

def test_dataset_form_update(self, app, sysadmin_env):
dataset = Dataset(
type="test-subfields",
Expand Down
7 changes: 7 additions & 0 deletions ckanext/scheming/tests/test_subfields.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ dataset_fields:
- field_name: country
label: Country

- field_name: publisher
label: Publisher
repeating_subfields:
- field_name: name
label: Name
- field_name: url
label: URL

resource_fields:

Expand Down

0 comments on commit 1d875c8

Please sign in to comment.