Import Restya board into Wekan using Bourne-again shell script to convert the JSON file.
This is a simple proof of concept shell script.
Step 1
Install Restyaboard. It was described earlier.
Step 2
Choose the Restya board to export.
Step 3
Export the board as a JSON file.
You will end up with a similar JSON file.
{ "id": 4, "name": "ToDo", "created": "2020-05-31T14:11:21", "modified": "2020-07-15T13:47:39", "username": "admin", "full_name": "New Admin", "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA", "user_id": 1, "organization_id": 0, "board_visibility": 0, "background_color": null, "background_picture_url": null, "commenting_permissions": null, "voting_permissions": null, "is_closed": 0, "is_allow_organization_members_to_join": 0, "boards_user_count": 1, "list_count": 4, "card_count": 4, "archived_list_count": 0, "archived_card_count": 0, "boards_subscriber_count": 1, "background_pattern_url": null, "is_show_image_front_of_card": 1, "music_name": null, "music_content": null, "organization_name": null, "organization_website_url": null, "organization_description": null, "organization_logo_url": null, "organization_visibility": null, "activities": [ { "id": 36, "created": "2020-07-15T14:36:26", "modified": "2020-07-15T14:36:26", "board_id": 4, "list_id": 0, "card_id": 0, "user_id": 1, "attachment_id": null, "type": "update_label", "comment": "##USER_NAME## updated Blog label on ##BOARD_NAME##", "revisions": "{\"id\":\"3\"}", "root": 0, "freshness_ts": null, "depth": 0, "path": null, "materialized_path": null, "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 35, "created": "2020-07-15T14:15:54", "modified": "2020-07-15T14:15:54", "board_id": 4, "list_id": 204, "card_id": 2, "user_id": 1, "attachment_id": 2, "type": "edit_card", "comment": "##USER_NAME## renamed ##CARD_LINK##", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:87:\"Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format\r\n\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:85:\"Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format\";}}", "root": 0, "freshness_ts": "2020-07-15T14:15:54.481854", "depth": 0, "path": "P35", "materialized_path": "0000000z", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 34, "created": "2020-07-15T13:47:39", "modified": "2020-07-15T13:47:39", "board_id": 4, "list_id": 0, "card_id": 0, "user_id": 1, "attachment_id": 4, "type": "edit_board", "comment": "##USER_NAME## renamed ##BOARD_NAME## board.", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:4:\"test\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:4:\"ToDo\";}}", "root": 0, "freshness_ts": "2020-07-15T13:47:39.744837", "depth": 0, "path": "P34", "materialized_path": "0000000y", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 33, "created": "2020-07-15T13:47:00", "modified": "2020-07-15T13:47:00", "board_id": 4, "list_id": 201, "card_id": 0, "user_id": 1, "attachment_id": 201, "type": "list_change_min", "comment": "##USER_NAME## minimized the ##LIST_NAME## list", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:13:\"custom_fields\";N;}s:9:\"new_value\";a:1:{s:13:\"custom_fields\";s:22:\"{\"list_collapse\":true}\";}}", "root": 0, "freshness_ts": "2020-07-15T13:47:00.717612", "depth": 0, "path": "P33", "materialized_path": "0000000x", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 32, "created": "2020-07-15T12:39:01", "modified": "2020-07-15T12:39:01", "board_id": 4, "list_id": 204, "card_id": 2, "user_id": 1, "attachment_id": 4, "type": "add_card_label", "comment": "##USER_NAME## added label(s) to the card ##CARD_LINK## - Wekan, GitHub", "revisions": null, "root": 0, "freshness_ts": "2020-07-15T12:39:01.939984", "depth": 0, "path": "P32", "materialized_path": "0000000w", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 31, "created": "2020-07-15T12:38:42", "modified": "2020-07-15T12:38:42", "board_id": 4, "list_id": 203, "card_id": 3, "user_id": 1, "attachment_id": 2, "type": "add_card_label", "comment": "##USER_NAME## added label(s) to the card ##CARD_LINK## - Wekan", "revisions": null, "root": 0, "freshness_ts": "2020-07-15T12:38:42.576506", "depth": 0, "path": "P31", "materialized_path": "0000000v", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 30, "created": "2020-07-15T12:38:34", "modified": "2020-07-15T12:38:34", "board_id": 4, "list_id": 202, "card_id": 4, "user_id": 1, "attachment_id": 2, "type": "add_card_label", "comment": "##USER_NAME## added label(s) to the card ##CARD_LINK## - Wekan", "revisions": null, "root": 0, "freshness_ts": "2020-07-15T12:38:34.091774", "depth": 0, "path": "P30", "materialized_path": "0000000u", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 29, "created": "2020-07-15T12:38:26", "modified": "2020-07-15T12:38:26", "board_id": 4, "list_id": 202, "card_id": 5, "user_id": 1, "attachment_id": 3, "type": "add_card_label", "comment": "##USER_NAME## added label(s) to the card ##CARD_LINK## - Wekan, Blog", "revisions": null, "root": 0, "freshness_ts": "2020-07-15T12:38:26.181555", "depth": 0, "path": "P29", "materialized_path": "0000000t", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 28, "created": "2020-07-15T12:38:15", "modified": "2020-07-15T12:38:15", "board_id": 4, "list_id": 202, "card_id": 5, "user_id": 1, "attachment_id": 5, "type": "edit_card", "comment": "##USER_NAME## renamed ##CARD_LINK##", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:6:\"test 4\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:48:\"Create blog post about Wekan import shell script\";}}", "root": 0, "freshness_ts": "2020-07-15T12:38:15.65556", "depth": 0, "path": "P28", "materialized_path": "0000000s", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 27, "created": "2020-07-15T12:37:56", "modified": "2020-07-15T12:37:56", "board_id": 4, "list_id": 201, "card_id": 5, "user_id": 1, "attachment_id": 202, "type": "move_card", "comment": "##USER_NAME## moved the card ##CARD_LINK## to Todo - This Week", "revisions": "a:2:{s:9:\"old_value\";a:2:{s:7:\"list_id\";s:3:\"201\";s:8:\"position\";s:5:\"3.125\";}s:9:\"new_value\";a:2:{s:7:\"list_id\";i:202;s:8:\"position\";d:3.25;}}", "root": 0, "freshness_ts": "2020-07-15T12:37:56.763516", "depth": 0, "path": "P27", "materialized_path": "0000000r", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 26, "created": "2020-07-15T12:37:52", "modified": "2020-07-15T12:37:52", "board_id": 4, "list_id": 201, "card_id": 4, "user_id": 1, "attachment_id": 202, "type": "move_card", "comment": "##USER_NAME## moved the card ##CARD_LINK## to Todo - This Week", "revisions": "a:2:{s:9:\"old_value\";a:2:{s:7:\"list_id\";s:3:\"201\";s:8:\"position\";s:4:\"2.25\";}s:9:\"new_value\";a:2:{s:7:\"list_id\";i:202;s:8:\"position\";d:2.25;}}", "root": 0, "freshness_ts": "2020-07-15T12:37:52.822083", "depth": 0, "path": "P26", "materialized_path": "0000000q", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 25, "created": "2020-07-15T12:37:48", "modified": "2020-07-15T12:37:48", "board_id": 4, "list_id": 201, "card_id": 4, "user_id": 1, "attachment_id": 4, "type": "edit_card", "comment": "##USER_NAME## renamed ##CARD_LINK##", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:6:\"test 3\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:40:\"Add labels for Wekan import shell script\";}}", "root": 0, "freshness_ts": "2020-07-15T12:37:48.43165", "depth": 0, "path": "P25", "materialized_path": "0000000p", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 24, "created": "2020-07-15T12:37:29", "modified": "2020-07-15T12:37:29", "board_id": 4, "list_id": 202, "card_id": 3, "user_id": 1, "attachment_id": 203, "type": "move_card", "comment": "##USER_NAME## moved the card ##CARD_LINK## to Doing - Today", "revisions": "a:2:{s:9:\"old_value\";a:2:{s:7:\"list_id\";s:3:\"202\";s:8:\"position\";s:3:\"1.5\";}s:9:\"new_value\";a:2:{s:7:\"list_id\";i:203;s:8:\"position\";d:1.5;}}", "root": 0, "freshness_ts": "2020-07-15T12:37:29.258112", "depth": 0, "path": "P24", "materialized_path": "0000000o", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 23, "created": "2020-07-15T12:37:26", "modified": "2020-07-15T12:37:26", "board_id": 4, "list_id": 201, "card_id": 3, "user_id": 1, "attachment_id": 202, "type": "move_card", "comment": "##USER_NAME## moved the card ##CARD_LINK## to Todo - This Week", "revisions": "a:2:{s:9:\"old_value\";a:2:{s:7:\"list_id\";s:3:\"201\";s:8:\"position\";s:3:\"1.5\";}s:9:\"new_value\";a:2:{s:7:\"list_id\";i:202;s:8:\"position\";d:1.5;}}", "root": 0, "freshness_ts": "2020-07-15T12:37:26.174011", "depth": 0, "path": "P23", "materialized_path": "0000000n", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 22, "created": "2020-07-15T12:37:21", "modified": "2020-07-15T12:37:21", "board_id": 4, "list_id": 201, "card_id": 3, "user_id": 1, "attachment_id": 3, "type": "edit_card", "comment": "##USER_NAME## renamed ##CARD_LINK##", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:6:\"test 2\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:29:\"Fix Wekan import shell script\";}}", "root": 0, "freshness_ts": "2020-07-15T12:37:21.006529", "depth": 0, "path": "P22", "materialized_path": "0000000m", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 21, "created": "2020-07-15T12:35:54", "modified": "2020-07-15T12:35:54", "board_id": 4, "list_id": 201, "card_id": 2, "user_id": 1, "attachment_id": 204, "type": "move_card", "comment": "##USER_NAME## moved the card ##CARD_LINK## to Done", "revisions": "a:2:{s:9:\"old_value\";a:2:{s:7:\"list_id\";s:3:\"201\";s:8:\"position\";s:1:\"1\";}s:9:\"new_value\";a:2:{s:7:\"list_id\";i:204;s:8:\"position\";i:1;}}", "root": 0, "freshness_ts": "2020-07-15T12:35:54.326438", "depth": 0, "path": "P21", "materialized_path": "0000000l", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 20, "created": "2020-07-15T12:35:48", "modified": "2020-07-15T12:35:48", "board_id": 4, "list_id": 201, "card_id": 2, "user_id": 1, "attachment_id": 2, "type": "edit_card", "comment": "##USER_NAME## renamed ##CARD_LINK##", "revisions": "a:2:{s:9:\"old_value\";a:1:{s:4:\"name\";s:5:\"test1\";}s:9:\"new_value\";a:1:{s:4:\"name\";s:87:\"Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format\r\n\";}}", "root": 0, "freshness_ts": "2020-07-15T12:35:48.285632", "depth": 0, "path": "P20", "materialized_path": "0000000k", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 10, "created": "2020-05-31T14:14:01", "modified": "2020-05-31T14:14:01", "board_id": 4, "list_id": 201, "card_id": 5, "user_id": 1, "attachment_id": 201, "type": "add_card", "comment": "##USER_NAME## added card ##CARD_LINK## to list \"Todo\".", "revisions": "", "root": 0, "freshness_ts": "2020-05-31T14:14:01.378558", "depth": 0, "path": "P10", "materialized_path": "0000000a", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 9, "created": "2020-05-31T14:13:59", "modified": "2020-05-31T14:13:59", "board_id": 4, "list_id": 201, "card_id": 4, "user_id": 1, "attachment_id": 201, "type": "add_card", "comment": "##USER_NAME## added card ##CARD_LINK## to list \"Todo\".", "revisions": "", "root": 0, "freshness_ts": "2020-05-31T14:13:59.296804", "depth": 0, "path": "P9", "materialized_path": "00000009", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" }, { "id": 8, "created": "2020-05-31T14:13:57", "modified": "2020-05-31T14:13:57", "board_id": 4, "list_id": 201, "card_id": 3, "user_id": 1, "attachment_id": 201, "type": "add_card", "comment": "##USER_NAME## added card ##CARD_LINK## to list \"Todo\".", "revisions": "", "root": 0, "freshness_ts": "2020-05-31T14:13:57.262071", "depth": 0, "path": "P8", "materialized_path": "00000008", "username": "admin", "role_id": 1, "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" } ], "boards_subscribers": [ { "id": 3, "created": "2020-05-31T14:11:21", "modified": "2020-05-31T14:11:21", "board_id": 4, "user_id": 1, "is_subscribed": 1 } ], "boards_stars": null, "attachments": null, "lists": [ { "id": 201, "created": "2020-05-31T14:11:21", "modified": "2020-07-15T13:47:00", "board_id": 4, "name": "Todo", "position": 1, "is_archived": 0, "card_count": 0, "lists_subscriber_count": 0, "cards": null, "lists_subscribers": null, "custom_fields": "{\"list_collapse\":true}", "color": null }, { "id": 202, "created": "2020-05-31T14:11:21", "modified": "2020-05-31T14:11:21", "board_id": 4, "name": "Todo - This Week", "position": 2, "is_archived": 0, "card_count": 2, "lists_subscriber_count": 0, "cards": [ { "id": 4, "created": "2020-05-31T14:13:59", "modified": "2020-07-15T12:37:52", "board_id": 4, "list_id": 202, "name": "Add labels for Wekan import shell script", "description": null, "due_date": null, "to_date": null, "position": 2.25, "is_archived": 0, "attachment_count": 0, "checklist_count": 0, "checklist_item_count": 0, "checklist_item_completed_count": 0, "label_count": 2, "cards_user_count": 0, "cards_subscriber_count": 0, "card_voter_count": 0, "activity_count": 0, "user_id": 1, "title": "Add labels for Wekan import shell script", "start": null, "end": null, "cards_checklists": null, "cards_users": null, "cards_voters": null, "cards_subscribers": null, "cards_labels": [ { "label_id": 2, "id": 4, "card_id": 4, "list_id": 202, "board_id": 4, "name": "Wekan", "color": null } ], "comment_count": 0, "custom_fields": null, "color": null, "notification_due_date": null, "is_due_date_notification_sent": false, "archived_date": null, "list_moved_date": "2020-07-15T12:37:52", "card_created_user": "New Admin" }, { "id": 5, "created": "2020-05-31T14:14:01", "modified": "2020-07-15T12:38:15", "board_id": 4, "list_id": 202, "name": "Create blog post about Wekan import shell script", "description": null, "due_date": null, "to_date": null, "position": 3.25, "is_archived": 0, "attachment_count": 0, "checklist_count": 0, "checklist_item_count": 0, "checklist_item_completed_count": 0, "label_count": 1, "cards_user_count": 0, "cards_subscriber_count": 0, "card_voter_count": 0, "activity_count": 0, "user_id": 1, "title": "Create blog post about Wekan import shell script", "start": null, "end": null, "cards_checklists": null, "cards_users": null, "cards_voters": null, "cards_subscribers": null, "cards_labels": [ { "label_id": 2, "id": 2, "card_id": 5, "list_id": 202, "board_id": 4, "name": "Wekan", "color": null }, { "label_id": 3, "id": 3, "card_id": 5, "list_id": 202, "board_id": 4, "name": "Blog", "color": "#23719f" } ], "comment_count": 0, "custom_fields": null, "color": null, "notification_due_date": null, "is_due_date_notification_sent": false, "archived_date": null, "list_moved_date": "2020-07-15T12:37:56", "card_created_user": "New Admin" } ], "lists_subscribers": null, "custom_fields": null, "color": null }, { "id": 203, "created": "2020-05-31T14:11:21", "modified": "2020-05-31T14:11:21", "board_id": 4, "name": "Doing - Today", "position": 3, "is_archived": 0, "card_count": 1, "lists_subscriber_count": 0, "cards": [ { "id": 3, "created": "2020-05-31T14:13:57", "modified": "2020-07-15T12:37:29", "board_id": 4, "list_id": 203, "name": "Fix Wekan import shell script", "description": null, "due_date": null, "to_date": null, "position": 1.5, "is_archived": 0, "attachment_count": 0, "checklist_count": 0, "checklist_item_count": 0, "checklist_item_completed_count": 0, "label_count": 3, "cards_user_count": 0, "cards_subscriber_count": 0, "card_voter_count": 0, "activity_count": 0, "user_id": 1, "title": "Fix Wekan import shell script", "start": null, "end": null, "cards_checklists": null, "cards_users": null, "cards_voters": null, "cards_subscribers": null, "cards_labels": [ { "label_id": 2, "id": 5, "card_id": 3, "list_id": 203, "board_id": 4, "name": "Wekan", "color": null } ], "comment_count": 0, "custom_fields": null, "color": null, "notification_due_date": null, "is_due_date_notification_sent": false, "archived_date": null, "list_moved_date": "2020-07-15T12:37:29", "card_created_user": "New Admin" } ], "lists_subscribers": null, "custom_fields": null, "color": null }, { "id": 204, "created": "2020-05-31T14:11:21", "modified": "2020-05-31T14:11:21", "board_id": 4, "name": "Done", "position": 4, "is_archived": 0, "card_count": 1, "lists_subscriber_count": 0, "cards": [ { "id": 2, "created": "2020-05-31T14:13:54", "modified": "2020-07-15T14:15:54", "board_id": 4, "list_id": 204, "name": "Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format", "description": null, "due_date": null, "to_date": null, "position": 1, "is_archived": 0, "attachment_count": 0, "checklist_count": 0, "checklist_item_count": 0, "checklist_item_completed_count": 0, "label_count": 1, "cards_user_count": 0, "cards_subscriber_count": 0, "card_voter_count": 0, "activity_count": 0, "user_id": 1, "title": "Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format", "start": null, "end": null, "cards_checklists": null, "cards_users": null, "cards_voters": null, "cards_subscribers": null, "cards_labels": [ { "label_id": 2, "id": 6, "card_id": 2, "list_id": 204, "board_id": 4, "name": "Wekan", "color": null }, { "label_id": 4, "id": 7, "card_id": 2, "list_id": 204, "board_id": 4, "name": "GitHub", "color": null } ], "comment_count": 0, "custom_fields": null, "color": null, "notification_due_date": null, "is_due_date_notification_sent": false, "archived_date": null, "list_moved_date": "2020-07-15T12:35:54", "card_created_user": "New Admin" } ], "lists_subscribers": null, "custom_fields": null, "color": null } ], "boards_users": [ { "id": 4, "created": "2020-05-31T14:11:21", "modified": "2020-05-31T14:11:21", "board_id": 4, "user_id": 1, "board_user_role_id": 1, "username": "admin", "email": "board@restya.com", "full_name": "New Admin", "is_active": 1, "is_email_confirmed": 1, "board_name": "ToDo", "profile_picture_path": "client/img/default-admin-user.png", "initials": "PA" } ], "default_email_list_id": 201, "is_default_email_position_as_bottom": false, "custom_fields": null, "auto_subscribe_on_board": true, "auto_subscribe_on_card": true, "sort_by": null, "sort_direction": null, "support_list_id": null, "support_custom_fields": null, "google_syn_url": "https://192.168.50.201//ical/4/1/3765a8cb64fce98b634a3fee8c22f83a.ics", "acl_links": [ { "board_user_role_id": 1, "slug": "add_board_users", "url": "/boards/?/users", "method": "POST" }, { "board_user_role_id": 1, "slug": "send_back_to_archived_list", "url": "/boards/?/lists/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "view_sync_calendar", "url": "/boards/?/sync_calendar", "method": "GET" }, { "board_user_role_id": 1, "slug": "copy_board", "url": "/boards/?/copy", "method": "POST" }, { "board_user_role_id": 1, "slug": "delete_all_archived_cards", "url": "/boards/?/cards", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_all_archived_lists", "url": "/boards/?/lists", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_labels", "url": "/boards/?/labels/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "edit_board", "url": "/boards/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "remove_board_user", "url": "/boards/?/boards_users/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "subscribe_board", "url": "/boards/?/board_subscribers", "method": "POST" }, { "board_user_role_id": 1, "slug": "board_subscriber", "url": "/boards/?/board_subscribers/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "edit_board_user", "url": "/boards_users/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "add_custom_background", "url": "/boards/?/custom_backgrounds", "method": "POST" }, { "board_user_role_id": 1, "slug": "view_board_activities", "url": "/boards/?/activities", "method": "GET" }, { "board_user_role_id": 1, "slug": "add_list", "url": "/boards/?/lists", "method": "POST" }, { "board_user_role_id": 1, "slug": "archive_list", "url": "/boaards/?/lists/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "delete_list", "url": "/boards/?/lists/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "edit_list", "url": "/boards/?/lists/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "subscribe_list", "url": "/boards/?/lists/?/list_subscribers", "method": "POST" }, { "board_user_role_id": 1, "slug": "unsubscribe_list", "url": "/boards/?/lists/?/list_subscribers/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "view_archived_lists", "url": "/boards/?/archived_lists", "method": "GET" }, { "board_user_role_id": 1, "slug": "add_card", "url": "/boards/?/lists/?/cards", "method": "POST" }, { "board_user_role_id": 1, "slug": "add_checklists", "url": "/boards/?/lists/?/cards/?/checklists", "method": "POST" }, { "board_user_role_id": 1, "slug": "add_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items", "method": "POST" }, { "board_user_role_id": 1, "slug": "archive_card", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "send_back_to_archived_card", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "add_labels", "url": "/boards/?/lists/?/cards/?/labels", "method": "POST" }, { "board_user_role_id": 1, "slug": "add_card_user", "url": "/boards/?/lists/?/cards/?/users/?", "method": "POST" }, { "board_user_role_id": 1, "slug": "view_card_activities", "url": "/boards/?/lists/?/cards/?/activities", "method": "GET" }, { "board_user_role_id": 1, "slug": "view_checklist_listing", "url": "/boards/?/lists/?/cards/?/checklists", "method": "GET" }, { "board_user_role_id": 1, "slug": "convert_item_to_card", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?/convert_to_card", "method": "POST" }, { "board_user_role_id": 1, "slug": "copy_card", "url": "/boards/?/lists/?/cards/?/copy", "method": "POST" }, { "board_user_role_id": 1, "slug": "delete_card", "url": "/boards/?/lists/?/cards/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_checklist", "url": "/boards/?/lists/?/cards/?/checklists/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_comment", "url": "/boards/?/lists/?/cards/?/comments/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "download_attachment_card", "url": "/download/?", "method": "GET" }, { "board_user_role_id": 1, "slug": "edit_card", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "edit_checklist", "url": "/boards/?/lists/?/cards/?/checklists/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "edit_comment", "url": "/boards/?/lists/?/cards/?/comments/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "edit_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "move_list_cards", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "comment_card", "url": "/boards/?/lists/?/cards/?/comments", "method": "POST" }, { "board_user_role_id": 1, "slug": "remove_card_attachment", "url": "/boards/?/lists/?/cards/?/attachments/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "delete_card_user", "url": "/boards/?/lists/?/cards/?/cards_users/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "view_card_search", "url": "/boards/?/cards/search", "method": "GET" }, { "board_user_role_id": 1, "slug": "subscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers", "method": "POST" }, { "board_user_role_id": 1, "slug": "unsubscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "unvote_card", "url": "/boards/?/lists/?/cards/?/card_voters/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "add_card_attachment", "url": "/boards/?/lists/?/cards/?/attachments", "method": "POST" }, { "board_user_role_id": 1, "slug": "view_archived_cards", "url": "/boards/?/archived_cards", "method": "GET" }, { "board_user_role_id": 1, "slug": "view_card_labels", "url": "/boards/?/lists/?/cards/?/labels", "method": "GET" }, { "board_user_role_id": 1, "slug": "vote_card", "url": "/boards/?/lists/?/cards/?/card_voters", "method": "POST" }, { "board_user_role_id": 2, "slug": "view_sync_calendar", "url": "/boards/?/sync_calendar", "method": "GET" }, { "board_user_role_id": 2, "slug": "copy_board", "url": "/boards/?/copy", "method": "POST" }, { "board_user_role_id": 2, "slug": "edit_board", "url": "/boards/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "subscribe_board", "url": "/boards/?/board_subscribers", "method": "POST" }, { "board_user_role_id": 2, "slug": "board_subscriber", "url": "/boards/?/board_subscribers/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "view_board_activities", "url": "/boards/?/activities", "method": "GET" }, { "board_user_role_id": 2, "slug": "add_custom_background", "url": "/boards/?/custom_backgrounds", "method": "POST" }, { "board_user_role_id": 2, "slug": "add_list", "url": "/boards/?/lists", "method": "POST" }, { "board_user_role_id": 2, "slug": "archive_list", "url": "/boaards/?/lists/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "delete_list", "url": "/boards/?/lists/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "edit_list", "url": "/boards/?/lists/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "subscribe_list", "url": "/boards/?/lists/?/list_subscribers", "method": "POST" }, { "board_user_role_id": 2, "slug": "unsubscribe_list", "url": "/boards/?/lists/?/list_subscribers/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "view_archived_lists", "url": "/boards/?/archived_lists", "method": "GET" }, { "board_user_role_id": 2, "slug": "add_card", "url": "/boards/?/lists/?/cards", "method": "POST" }, { "board_user_role_id": 2, "slug": "add_checklists", "url": "/boards/?/lists/?/cards/?/checklists", "method": "POST" }, { "board_user_role_id": 2, "slug": "add_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items", "method": "POST" }, { "board_user_role_id": 2, "slug": "archive_card", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "add_labels", "url": "/boards/?/lists/?/cards/?/labels", "method": "POST" }, { "board_user_role_id": 2, "slug": "add_card_user", "url": "/boards/?/lists/?/cards/?/users/?", "method": "POST" }, { "board_user_role_id": 2, "slug": "view_card_activities", "url": "/boards/?/lists/?/cards/?/activities", "method": "GET" }, { "board_user_role_id": 2, "slug": "view_checklist_listing", "url": "/boards/?/lists/?/cards/?/checklists", "method": "GET" }, { "board_user_role_id": 2, "slug": "convert_item_to_card", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?/convert_to_card", "method": "POST" }, { "board_user_role_id": 2, "slug": "copy_card", "url": "/boards/?/lists/?/cards/?/copy", "method": "POST" }, { "board_user_role_id": 2, "slug": "delete_card", "url": "/boards/?/lists/?/cards/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "delete_checklist", "url": "/boards/?/lists/?/cards/?/checklists/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "delete_comment", "url": "/boards/?/lists/?/cards/?/comments/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "delete_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "download_attachment_card", "url": "/download/?", "method": "GET" }, { "board_user_role_id": 2, "slug": "edit_card", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "edit_checklist", "url": "/boards/?/lists/?/cards/?/checklists/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "edit_comment", "url": "/boards/?/lists/?/cards/?/comments/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "edit_checklist_item", "url": "/boards/?/lists/?/cards/?/checklists/?/items/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "move_list_cards", "url": "/boards/?/lists/?/cards/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "comment_card", "url": "/boards/?/lists/?/cards/?/comments", "method": "POST" }, { "board_user_role_id": 2, "slug": "remove_card_attachment", "url": "/boards/?/lists/?/cards/?/attachments/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "delete_card_user", "url": "/boards/?/lists/?/cards/?/cards_users/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "view_card_search", "url": "/boards/?/cards/search", "method": "GET" }, { "board_user_role_id": 2, "slug": "subscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers", "method": "POST" }, { "board_user_role_id": 2, "slug": "unsubscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "unvote_card", "url": "/boards/?/lists/?/cards/?/card_voters/?", "method": "DELETE" }, { "board_user_role_id": 2, "slug": "add_card_attachment", "url": "/boards/?/lists/?/cards/?/attachments", "method": "POST" }, { "board_user_role_id": 2, "slug": "view_archived_cards", "url": "/boards/?/archived_cards", "method": "GET" }, { "board_user_role_id": 2, "slug": "view_card_labels", "url": "/boards/?/lists/?/cards/?/labels", "method": "GET" }, { "board_user_role_id": 2, "slug": "vote_card", "url": "/boards/?/lists/?/cards/?/card_voters", "method": "POST" }, { "board_user_role_id": 3, "slug": "view_sync_calendar", "url": "/boards/?/sync_calendar", "method": "GET" }, { "board_user_role_id": 3, "slug": "subscribe_board", "url": "/boards/?/board_subscribers", "method": "POST" }, { "board_user_role_id": 3, "slug": "board_subscriber", "url": "/boards/?/board_subscribers/?", "method": "PUT" }, { "board_user_role_id": 3, "slug": "view_board_activities", "url": "/boards/?/activities", "method": "GET" }, { "board_user_role_id": 3, "slug": "subscribe_list", "url": "/boards/?/lists/?/list_subscribers", "method": "POST" }, { "board_user_role_id": 3, "slug": "unsubscribe_list", "url": "/boards/?/lists/?/list_subscribers/?", "method": "PUT" }, { "board_user_role_id": 3, "slug": "view_archived_lists", "url": "/boards/?/archived_lists", "method": "GET" }, { "board_user_role_id": 3, "slug": "view_card_activities", "url": "/boards/?/lists/?/cards/?/activities", "method": "GET" }, { "board_user_role_id": 3, "slug": "view_checklist_listing", "url": "/boards/?/lists/?/cards/?/checklists", "method": "GET" }, { "board_user_role_id": 3, "slug": "download_attachment_card", "url": "/download/?", "method": "GET" }, { "board_user_role_id": 3, "slug": "subscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers", "method": "POST" }, { "board_user_role_id": 3, "slug": "unsubscribe_card", "url": "/boards/?/lists/?/cards/?/card_subscribers/?", "method": "PUT" }, { "board_user_role_id": 3, "slug": "view_archived_cards", "url": "/boards/?/archived_cards", "method": "GET" }, { "board_user_role_id": 3, "slug": "view_card_labels", "url": "/boards/?/lists/?/cards/?/labels", "method": "GET" }, { "board_user_role_id": 3, "slug": "vote_card", "url": "/boards/?/lists/?/cards/?/card_voters", "method": "POST" }, { "board_user_role_id": 1, "slug": "edit_labels", "url": "/labels/?", "method": "PUT" }, { "board_user_role_id": 2, "slug": "edit_labels", "url": "/labels/?", "method": "PUT" }, { "board_user_role_id": 1, "slug": "archive_all_cards_in_the_list", "url": "/boards/?/lists/?/cards", "method": "PUT" }, { "board_user_role_id": 2, "slug": "archive_all_cards_in_the_list", "url": "/boards/?/lists/?/cards", "method": "PUT" }, { "board_user_role_id": 1, "slug": "delete_board", "url": "/boards/?", "method": "DELETE" }, { "board_user_role_id": 1, "slug": "get_board_lists", "url": "/boards/?/lists", "method": "GET" }, { "board_user_role_id": 2, "slug": "get_board_lists", "url": "/boards/?/lists", "method": "GET" }, { "board_user_role_id": 1, "slug": "view_card_isting", "url": "/boards/?/lists/?/cards/?", "method": "GET" }, { "board_user_role_id": 2, "slug": "view_card_isting", "url": "/boards/?/lists/?/cards/?", "method": "GET" }, { "board_user_role_id": 1, "slug": "view_board_label_isting", "url": "/boards/?/labels", "method": "GET" }, { "board_user_role_id": 2, "slug": "view_board_label_isting", "url": "/boards/?/labels", "method": "GET" } ], "board_user_roles": [ { "id": 1, "created": "2016-02-22T17:39:17.68", "modified": "2016-02-22T17:39:17.68", "name": "Owner", "description": "Can view and edit cards, remove members, and change settings for the board." }, { "id": 2, "created": "2016-02-22T17:39:17.68", "modified": "2016-02-22T17:39:17.68", "name": "Editor", "description": "Can view and edit cards, remove members, but not change settings." }, { "id": 3, "created": "2016-02-22T17:39:17.68", "modified": "2016-02-22T17:39:17.68", "name": "Viewer", "description": "Can view only." } ] }
Step 4
Create a simple shell script to convert Restyaboard JSON to Wekan JSON format.
#!/bin/bash # Convert Restyaboard JSON to Wekan JSON # This is only a proof of concept shell script # Wekan label colors COLORS=("green" "yellow" "orange" "red" "purple" "blue" "sky" "lime" "pink" "black" "silver" "peachpuff" "crimson" "plum" "darkgreen" "slateblue" "magenta" "gold" "navy" "gray" "saddlebrown" "paleturquoise" "mistyrose" "indigo") NCOLORS="$((${#COLORS[@]} - 1))" # usage info usage(){ echo "Usage:" echo " $0 -j restyaboard.json" echo "" echo "Parameters:" echo " -j restyaboard.json : set Restyaboard JSON board (required)" echo "" } # parse parameters while getopts "j:" option; do case $option in "j") param_board_json="${OPTARG}" param_board_json_defined=true ;; \?|:|*) usage exit ;; esac done if [ "${param_board_json_defined}" = true ]; then board_id=$(jq -r '.id' "${param_board_json}") board_title=$(jq -r '.name ' "${param_board_json}") cat << EOF { "_format": "wekan-board-1.0.0", "_id": "${board_id}", "title": "${board_title}", "permission": "private", "archived": false, "members": [ { "userId": "user", "isAdmin": true, "isActive": true, "isNoComments": false, "isCommentOnly": false, "isWorker": false } ], "type": "board", EOF last_list_element="$(jq -r '[.lists[].id] | .[-1]' "${param_board_json}")" echo ' "lists": [' for list_id in $(jq -r .lists[].id "${param_board_json}"); do list_name=$(jq -r '.lists[] | select(.id == '${list_id}') | .name' "${param_board_json}") list_position=$(jq -r '.lists[] | select(.id == '${list_id}') | .position' "${param_board_json}") cat << EOF { "_id": "${list_id}", "title": "${list_name}", "sort": ${list_position}, "type": "list" EOF if [ "$last_list_element" == "$list_id" ]; then echo " }" else echo " }," fi done echo ' ],' # count labels label_elements=0 label_elements_list="" for list_id in $(jq -r .lists[].id "${param_board_json}"); do list_cards="$(jq -r '.lists[] | select(.id == '${list_id}') | select(.cards != null) | .cards[].id' "${param_board_json}")" for card_id in ${list_cards}; do card_labels=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | if (.cards_labels) then .cards_labels[].label_id else empty end' "${param_board_json}") label_elements_list="$label_elements_list $card_labels" done done if [ -n "$label_elements_list" ]; then label_elements_list="$(echo $label_elements_list | tr ' ' '\n' | sort -u)" label_elements="$(echo $label_elements_list | tr ' ' '\n' | wc -l)" fi # labels labels_seen="" echo ' "labels": [' label_n=1 for list_id in $(jq -r .lists[].id "${param_board_json}"); do list_cards="$(jq -r '.lists[] | select(.id == '${list_id}') | select(.cards != null) | .cards[].id' "${param_board_json}")" if [ -n "${list_cards}" ]; then for card_id in ${list_cards}; do list_labels=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | if (.cards_labels) then .cards_labels[].label_id else empty end' "${param_board_json}") for label_id in ${list_labels}; do check="$(echo $labels_seen | grep -q -w $label_id; echo $?)" if [ "$check" != "0" ]; then label_name=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | .cards_labels[] | select(.label_id == '${label_id}') | .name' "${param_board_json}") label_color="${COLORS[$((RANDOM % NCOLORS))]}" cat << EOF { "_id": "${label_id}", "name": "${label_name}", "color": "${label_color}" EOF if [ "$label_elements" == "$label_n" ]; then echo " }" else echo " }," fi label_n="$((label_n + 1))" labels_seen="$labels_seen $label_id" fi done done fi done echo ' ],' # count cards card_elements=0 for list_id in $(jq -r .lists[].id "${param_board_json}"); do list_cards="$(jq -r '.lists[] | select(.id == '${list_id}') | select(.cards != null) | [.cards[].id] | length' "${param_board_json}")" if [ -n "$list_cards" ]; then card_elements="$((card_elements + list_cards))" fi done # cards echo ' "cards": [' card_n=1 for list_id in $(jq -r .lists[].id "${param_board_json}"); do list_cards="$(jq -r '.lists[] | select(.id == '${list_id}') | select(.cards != null) | .cards[].id' "${param_board_json}")" if [ -n "${list_cards}" ]; then for card_id in ${list_cards}; do card_id=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | .id' "${param_board_json}") card_name=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | .name' "${param_board_json}") cat << EOF { "_id": "${card_id}", "title": "${card_name}", "swimlaneId": "swimlane", "listId": "${list_id}", EOF # card labels list_labels=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | if (.cards_labels) then .cards_labels[].label_id else empty end' "${param_board_json}") if [ -n "$list_labels" ]; then label_elements=$(jq -r '.lists[] | select(.id == '${list_id}') | .cards[] | select(.id == '${card_id}') | .cards_labels | length' "${param_board_json}") label_n=1 echo " \"labelIds\": [" for label_id in ${list_labels}; do echo -n " \"${label_id}\"" if [ "$label_elements" != "$label_n" ]; then echo "," else echo fi label_n="$((label_n + 1))" done echo " ]" fi if [ "$card_elements" == "$card_n" ]; then echo " }" else echo " }," fi card_n="$((card_n + 1))" done fi done echo ' ],' cat << EOF "swimlanes": [ { "_id": "swimlane", "title": "Default swimlane", "archived": false, "type": "swimlane", "sort": 0 } ], "activities": [ ], "customFields": [ ], "comments": [ ], "rules": [], "checklists": [ ], "checklistItems": [ ], "subtaskItems": [ ], "triggers": [], "actions": [], "attachments": [], "users": [ { "_id": "user", "username": "user", "profile": {} } ] } EOF else usage fi
Step 5
Convert Restya board JSON file.
$ bash restya_to_wekan.sh -j 4.sjon
It will create the following output.
{ "_format": "wekan-board-1.0.0", "_id": "4", "title": "ToDo", "permission": "private", "archived": false, "members": [ { "userId": "user", "isAdmin": true, "isActive": true, "isNoComments": false, "isCommentOnly": false, "isWorker": false } ], "type": "board", "lists": [ { "_id": "201", "title": "Todo", "sort": 1, "type": "list" }, { "_id": "202", "title": "Todo - This Week", "sort": 2, "type": "list" }, { "_id": "203", "title": "Doing - Today", "sort": 3, "type": "list" }, { "_id": "204", "title": "Done", "sort": 4, "type": "list" } ], "labels": [ { "_id": "2", "name": "Wekan", "color": "orange" }, { "_id": "3", "name": "Blog", "color": "silver" }, { "_id": "4", "name": "GitHub", "color": "navy" } ], "cards": [ { "_id": "4", "title": "Add labels for Wekan import shell script", "swimlaneId": "swimlane", "listId": "202", "labelIds": [ "2" ] }, { "_id": "5", "title": "Create blog post about Wekan import shell script", "swimlaneId": "swimlane", "listId": "202", "labelIds": [ "2", "3" ] }, { "_id": "3", "title": "Fix Wekan import shell script", "swimlaneId": "swimlane", "listId": "203", "labelIds": [ "2" ] }, { "_id": "2", "title": "Create proof of concept shell script to convert Restyaboard JSON to Wekan JSON format", "swimlaneId": "swimlane", "listId": "204", "labelIds": [ "2", "4" ] } ], "swimlanes": [ { "_id": "swimlane", "title": "Default swimlane", "archived": false, "type": "swimlane", "sort": 0 } ], "activities": [ ], "customFields": [ ], "comments": [ ], "rules": [], "checklists": [ ], "checklistItems": [ ], "subtaskItems": [ ], "triggers": [], "actions": [], "attachments": [], "users": [ { "_id": "user", "username": "user", "profile": {} } ] }
Label colors are chosen randomly.
Step 6
Import it to the Wekan.
Additional notes
This is a simple proof of concept. Please read Importing JSON from Restyaboard #3181 for more details.