{"id":196,"date":"2016-09-19T11:19:52","date_gmt":"2016-09-19T15:19:52","guid":{"rendered":"http:\/\/provideotech.org\/?p=196"},"modified":"2016-09-19T11:19:52","modified_gmt":"2016-09-19T15:19:52","slug":"creating-and-modifying-hierarchical-metadata-programmatically-with-cantemo-portal","status":"publish","type":"post","link":"https:\/\/provideotech.org\/?p=196","title":{"rendered":"Creating and modifying hierarchical metadata programmatically with Cantemo Portal"},"content":{"rendered":"<p>As of Cantemo Portal 2.2, we can now create hierarchical metadata fields in the system.  Obviously when we have large data sets, this may be uncomfortable to do by hand.  Luckily, there is a REST API that allows us to create, delete, and update metadata hierarchies.<\/p>\n<p>To get IDs on fields we know are hierarchy fields, call this<\/p>\n<pre lang=\"shell\">\r\ncurl -H accept:application\/json -u admin:admin http:\/\/<cantemoserver>\/API\/v2\/metadata-schema\/fields\/<hierarchy_portal_mf_id>\/hierarchy\/ | python -m json.tool\r\n<\/pre>\n<p>That\u2019ll dump out JSON for you<\/p>\n<pre lang=\"json\">\r\n{\r\n    \"meta\": {\r\n        \"first_on_page\": 1,\r\n        \"has_next\": false,\r\n        \"has_other_pages\": false,\r\n        \"has_previous\": false,\r\n        \"hits\": 1,\r\n        \"last_on_page\": 1,\r\n        \"next\": 2,\r\n        \"page\": 1,\r\n        \"pages\": 1,\r\n        \"previous\": 0,\r\n        \"results_per_page\": 100\r\n    },\r\n    \"objects\": [\r\n        {\r\n            \"display_type\": \"LOOKUP\",\r\n            \"external_id\": null,\r\n            \"id\": 1,\r\n            \"label\": \"Root Field Label\",\r\n            \"level\": 0,\r\n            \"name\": \"Root Field Name\",\r\n            \"parent_id\": null,\r\n            \"path\": []\r\n        }\r\n    ]\r\n}\r\n<\/pre>\n<p>Now I know my ID and I can get children on the root ID<\/p>\n<pre lang=\"json\">\r\ncurl -H accept:application\/json -u admin:admin http:\/\/<cantemoserver>\/API\/v2\/metadata-schema\/fields\/<hierarchy_portal_mf_id>\/hierarchy\/1\/children\/ | python -m json.tool\r\n<\/pre>\n<p>Which gives me all the children on that node<\/p>\n<pre lang=\"json\">\r\n{\r\n    \"meta\": {\r\n        \"first_on_page\": 1,\r\n        \"has_next\": false,\r\n        \"has_other_pages\": false,\r\n        \"has_previous\": false,\r\n        \"hits\": 69,\r\n        \"last_on_page\": 69,\r\n        \"next\": 2,\r\n        \"page\": 1,\r\n        \"pages\": 1,\r\n        \"previous\": 0,\r\n        \"results_per_page\": 100\r\n    },\r\n    \"object\": {\r\n        \"display_type\": \"LOOKUP\",\r\n        \"external_id\": null,\r\n        \"id\": 1,\r\n        \"label\": \"Root Field Label\",\r\n        \"level\": 0,\r\n        \"name\": \"Root Field Name\",\r\n        \"parent_id\": null,\r\n        \"path\": []\r\n    },\r\n    \"objects\": [\r\n        {\r\n            \"display_type\": \"LOOKUP\",\r\n            \"external_id\": null,\r\n            \"id\": 505,\r\n            \"label\": \"Child 1 Label\",\r\n            \"level\": 1,\r\n            \"name\": \"Child 1 Name\",\r\n            \"parent_id\": 1,\r\n            \"path\": [\r\n                {\r\n                    \"id\": 1,\r\n                    \"label\": \"Root Field Label\",\r\n                    \"name\": \"Root Field Name\"\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            \"display_type\": \"LOOKUP\",\r\n            \"external_id\": null,\r\n            \"id\": 5,\r\n            \"label\": \"Child 2 Label\",\r\n            \"level\": 1,\r\n            \"name\": \"Child 2 Name\",\r\n            \"parent_id\": 1,\r\n            \"path\": [\r\n                {\r\n                    \"id\": 1,\r\n                    \"label\": \"Root Field Label\",\r\n                    \"name\": \"Root Field Name\"\r\n                }\r\n            ]\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Now that I know a bunch of node IDs, I can post in to create a new one<\/p>\n<pre lang=\"shell\">\r\ncurl -X POST -H content-type:application\/json -H accept:application\/json -u admin:admin http:\/\/<cantemoserver>\/API\/v2\/metadata-schema\/fields\/<hierarchy_portal_mf_id>\/hierarchy\/ --data-binary '{\"name\":\"test\",\"label\":\"test\",\"parent_id\":1}' | python -m json.tool\r\n<\/pre>\n<p>Which again gives me a success JSON (or an error if you mess up)<\/p>\n<pre lang=\"json\">\r\n{\r\n    \"display_type\": \"LOOKUP\",\r\n    \"external_id\": null,\r\n    \"id\": 2075,\r\n    \"label\": \"test\",\r\n    \"level\": 1,\r\n    \"name\": \"test\",\r\n    \"parent_id\": 1,\r\n    \"path\": [\r\n        {\r\n            \"id\": 1,\r\n            \"label\": \"Root Field Label\",\r\n            \"name\": \"Root Field Name\"\r\n        }\r\n    ]\r\n}\r\n<\/pre>\n<p>If you want to update an existing node rather than create one, you use the PUT method on that node ID itself.<\/p>\n<pre lang=\"shell\">\r\ncurl -X POST -H content-type:application\/json -H accept:application\/json -u admin:admin http:\/\/<cantemoserver>\/API\/v2\/metadata-schema\/fields\/<hierarchy_portal_mf_id>\/hierarchy\/2075\/ --data-binary '{\"name\":\"test2\",\"label\":\"test2\",\"parent_id\":1}' | python -m json.tool\r\n<\/pre>\n<p>On success, this also returns the JSON of my node with its updated information (or an error if I screwed up)<\/p>\n<pre lang=\"json\">\r\n{\r\n    \"display_type\": \"LOOKUP\",\r\n    \"external_id\": null,\r\n    \"id\": 2075,\r\n    \"label\": \"test2\",\r\n    \"level\": 1,\r\n    \"name\": \"test2\",\r\n    \"parent_id\": 1,\r\n    \"path\": [\r\n        {\r\n            \"id\": 1,\r\n            \"label\": \"Root Field Label\",\r\n            \"name\": \"Root Field Name\"\r\n        }\r\n    ]\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>As of Cantemo Portal 2.2, we can now create hierarchical metadata fields in the system. Obviously when we have large data sets, this may be uncomfortable to do by hand. Luckily, there is a REST API that allows us to create, delete, and update metadata hierarchies. To get IDs on fields we know are hierarchy &hellip; <a href=\"https:\/\/provideotech.org\/?p=196\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Creating and modifying hierarchical metadata programmatically with Cantemo Portal&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13,3,5],"tags":[],"class_list":["post-196","post","type-post","status-publish","format-standard","hentry","category-cantemo-portal","category-general-info","category-software"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2bwLw-3a","_links":{"self":[{"href":"https:\/\/provideotech.org\/index.php?rest_route=\/wp\/v2\/posts\/196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/provideotech.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/provideotech.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/provideotech.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/provideotech.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=196"}],"version-history":[{"count":0,"href":"https:\/\/provideotech.org\/index.php?rest_route=\/wp\/v2\/posts\/196\/revisions"}],"wp:attachment":[{"href":"https:\/\/provideotech.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/provideotech.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/provideotech.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}