diff --git a/glare/engine.py b/glare/engine.py index 5c4c45f..1dddd8f 100644 --- a/glare/engine.py +++ b/glare/engine.py @@ -208,6 +208,9 @@ class Engine(object): old_val = getattr(af, field_name) setattr(af, field_name, af_dict[field_name]) + if operation.operation.get("op") == "move": + source_field = operation.from_path + setattr(af, source_field, af_dict[source_field]) new_val = getattr(af, field_name) if new_val == old_val: # No need to save value to db if it's not changed diff --git a/glare/tests/functional/test_sample_artifact.py b/glare/tests/functional/test_sample_artifact.py index d496a1d..d51372d 100644 --- a/glare/tests/functional/test_sample_artifact.py +++ b/glare/tests/functional/test_sample_artifact.py @@ -2181,6 +2181,68 @@ class TestUpdate(base.TestArtifact): url = '/sample_artifact/%s' % art1['id'] self.patch(url=url, data=data, status=400) + # data add tags and metadata to artifact + data = [{'op': 'add', + 'path': '/tags/0', + 'value': 'tag1'}, + {'op': 'add', + 'path': '/tags/1', + 'value': 'tag2'}, + {'op': 'add', + 'path': '/metadata/meta1', + 'value': 'value1'}] + url = '/sample_artifact/%s' % art1['id'] + result = self.patch(url=url, data=data) + self.assertEqual(['tag1', 'tag2'], result['tags']) + self.assertEqual({'meta1': 'value1'}, result['metadata']) + + # move tag to metadata + data = [{"op": "move", + "from": "/tags/0", + "path": "/metadata/meta2"}] + url = '/sample_artifact/%s' % art1['id'] + result = self.patch(url=url, data=data) + self.assertEqual(['tag2'], result['tags']) + self.assertEqual({'meta1': 'value1', 'meta2': 'tag1'}, + result['metadata']) + + # move data from one dict to another one + data = [{"op": "move", + "from": "/dict_of_str/wrong_type", + "path": "/metadata/wrong_type"}] + url = '/sample_artifact/%s' % art1['id'] + result = self.patch(url=url, data=data) + self.assertEqual({}, result['dict_of_str']) + self.assertEqual({'meta1': 'value1', + 'meta2': 'tag1', + 'wrong_type': '1'}, result['metadata']) + + # move data from one data to another one having same key + + data = [{"op": "add", + "path": "/dict_of_str/new_key", + "value": "new_value"}, + {"op": "add", + "path": "/metadata/new_key", + "value": "new_value"}] + url = '/sample_artifact/%s' % art1['id'] + result = self.patch(url=url, data=data) + self.assertEqual({"new_key": "new_value"}, result['dict_of_str']) + self.assertEqual({'meta1': 'value1', + 'meta2': 'tag1', + 'wrong_type': '1', + "new_key": "new_value"}, result['metadata']) + + data = [{"op": "move", + "from": "/dict_of_str/new_key", + "path": "/metadata/new_key"}] + result = self.patch(url=url, data=data) + self.assertEqual({}, result['dict_of_str']) + self.assertEqual({'meta1': 'value1', + 'meta2': 'tag1', + 'wrong_type': '1', + "new_key": "new_value"}, result['metadata']) + def test_update_field_list(self): art1 = self.create_artifact(data={"name": "art1"})