Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 873199f

Browse files
committed
[#5190] Handle custom fields in metadata_modified logic
Up until now it only applied to core fields exisiting in the db, but if you added, removed or changed custom fields (all dumped in the extras field) the date didn't change. Added tests for this.
1 parent 20f2c06 commit 873199f

2 files changed

Lines changed: 87 additions & 2 deletions

File tree

ckan/lib/dictization/model_save.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ def resource_dict_save(res_dict, context):
6565
# of in a separate extras field like packages and groups
6666
new_extras[key] = value
6767

68+
# Check changes in extra fields
69+
if set(new_extras.keys()) != set(obj.extras.keys()):
70+
has_changed = True
71+
else:
72+
for key, value in six.iteritems(new_extras):
73+
if obj.extras.get(key) != value:
74+
has_changed = True
75+
break
76+
6877
if has_changed:
6978
obj.metadata_modified = datetime.datetime.utcnow()
7079
obj.state = u'active'
@@ -73,6 +82,7 @@ def resource_dict_save(res_dict, context):
7382
session.add(obj)
7483
return obj
7584

85+
7686
def package_resource_list_save(res_dicts, package, context):
7787
allow_partial_update = context.get("allow_partial_update", False)
7888
if res_dicts is None and allow_partial_update:

ckan/tests/logic/action/test_update.py

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,7 @@ def test_resource_format_update(self):
14121412

14131413
def test_edit_metadata_updates_metadata_modified_field(self):
14141414
dataset = factories.Dataset()
1415-
resource = factories.Resource(package=dataset)
1415+
resource = factories.Resource(package_id=dataset['id'])
14161416

14171417
with freeze_time('2020-02-25 12:00:00'):
14181418
resource = helpers.call_action(
@@ -1426,7 +1426,11 @@ def test_same_values_dont_update_metadata_modified_field(self):
14261426
dataset = factories.Dataset()
14271427

14281428
with freeze_time('1987-03-04 23:30:00'):
1429-
resource = factories.Resource(package=dataset, description='Test')
1429+
resource = factories.Resource(
1430+
package_id=dataset['id'],
1431+
description='Test',
1432+
some_custom_field='test',
1433+
)
14301434
assert (resource['metadata_modified'] ==
14311435
datetime.datetime.utcnow().isoformat())
14321436

@@ -1435,13 +1439,84 @@ def test_same_values_dont_update_metadata_modified_field(self):
14351439
"resource_update",
14361440
id=resource["id"],
14371441
description='Test',
1442+
some_custom_field='test',
14381443
url='http://link.to.some.data' # Default Value from Factory
14391444
)
14401445
assert (resource['metadata_modified'] !=
14411446
datetime.datetime.utcnow().isoformat())
14421447
assert (resource['metadata_modified'] ==
14431448
'1987-03-04T23:30:00')
14441449

1450+
def test_new_keys_update_metadata_modified_field(self):
1451+
dataset = factories.Dataset()
1452+
1453+
with freeze_time('1987-03-04 23:30:00'):
1454+
resource = factories.Resource(package_id=dataset['id'], description='test')
1455+
assert (resource['metadata_modified'] ==
1456+
datetime.datetime.utcnow().isoformat())
1457+
1458+
with freeze_time('2020-02-25 12:00:00'):
1459+
resource = helpers.call_action(
1460+
"resource_update",
1461+
id=resource["id"],
1462+
description='test',
1463+
some_custom_field='test',
1464+
url='http://link.to.some.data' # default value from factory
1465+
)
1466+
assert (resource['metadata_modified'] ==
1467+
datetime.datetime.utcnow().isoformat())
1468+
assert (resource['metadata_modified'] ==
1469+
'2020-02-25T12:00:00')
1470+
1471+
def test_remove_keys_update_metadata_modified_field(self):
1472+
dataset = factories.Dataset()
1473+
1474+
with freeze_time('1987-03-04 23:30:00'):
1475+
resource = factories.Resource(
1476+
package_id=dataset['id'],
1477+
description='test',
1478+
some_custom_field='test',
1479+
)
1480+
assert (resource['metadata_modified'] ==
1481+
datetime.datetime.utcnow().isoformat())
1482+
1483+
with freeze_time('2020-02-25 12:00:00'):
1484+
resource = helpers.call_action(
1485+
"resource_update",
1486+
id=resource["id"],
1487+
description='test',
1488+
url='http://link.to.some.data' # default value from factory
1489+
)
1490+
assert (resource['metadata_modified'] ==
1491+
datetime.datetime.utcnow().isoformat())
1492+
assert (resource['metadata_modified'] ==
1493+
'2020-02-25T12:00:00')
1494+
1495+
def test_update_keys_update_metadata_modified_field(self):
1496+
dataset = factories.Dataset()
1497+
1498+
with freeze_time('1987-03-04 23:30:00'):
1499+
resource = factories.Resource(
1500+
package_id=dataset['id'],
1501+
description='test',
1502+
some_custom_field='test',
1503+
)
1504+
assert (resource['metadata_modified'] ==
1505+
datetime.datetime.utcnow().isoformat())
1506+
1507+
with freeze_time('2020-02-25 12:00:00'):
1508+
resource = helpers.call_action(
1509+
"resource_update",
1510+
id=resource["id"],
1511+
description='test',
1512+
some_custom_field='test2',
1513+
url='http://link.to.some.data' # default value from factory
1514+
)
1515+
assert (resource['metadata_modified'] ==
1516+
datetime.datetime.utcnow().isoformat())
1517+
assert (resource['metadata_modified'] ==
1518+
'2020-02-25T12:00:00')
1519+
14451520

14461521
@pytest.mark.usefixtures("clean_db", "with_request_context")
14471522
class TestConfigOptionUpdate(object):

0 commit comments

Comments
 (0)