Skip to content

Commit 225f5ee

Browse files
authored
Merge pull request #107 from docusign/DEVDOCS-16285
Devdocs 16285
2 parents 54bc264 + ebda727 commit 225f5ee

File tree

2 files changed

+108
-38
lines changed

2 files changed

+108
-38
lines changed

examples/ConnectedFields/eg001SetConnectedFields.sh

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,6 @@ if [[ $SHELL != *"bash"* ]]; then
33
echo "PROBLEM: Run these scripts from within the bash shell."
44
fi
55

6-
if ! command -v jq &> /dev/null; then
7-
echo "jq is not installed. Installing jq..."
8-
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
9-
sudo apt-get update && sudo apt-get install -y jq # For Debian/Ubuntu
10-
elif [[ "$OSTYPE" == "darwin"* ]]; then
11-
brew install jq # For macOS (Homebrew)
12-
elif [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then
13-
echo "Please install jq manually from: https://stedolan.github.io/jq/download/"
14-
exit 1
15-
else
16-
echo "Unsupported OS. Please install jq manually."
17-
exit 1
18-
fi
19-
else
20-
echo "jq is already installed."
21-
fi
22-
236
ds_access_token_path="config/ds_access_token.txt"
247
verification_file="config/verification_app.txt"
258

@@ -50,16 +33,29 @@ echo "Response:"
5033
cat $response
5134
echo ""
5235

36+
invoke_python() {
37+
if [[ $(python3 --version 2>&1) == *"not found"* ]]; then
38+
if [[ $(python --version 2>&1) != *"not found"* ]]; then
39+
python -c "from examples.ConnectedFields.jsonParsingUtils import *; from json import *; print($1)"
40+
else
41+
echo "Either python or python3 must be installed to use this option."
42+
exit 1
43+
fi
44+
else
45+
python3 -c "from examples.ConnectedFields.jsonParsingUtils import *; from json import *; print($1)"
46+
fi
47+
}
48+
5349
#Extract tab data from response
5450
#ds-snippet-start:ConnectedFields1Step4
5551
extract_verify_info() {
5652
clean_response=$(sed -n '/\[/,$p' "$response")
57-
echo "$clean_response" | jq '[.[] | select((.tabs[]?.extensionData.actionContract | contains("Verify")) or (.tabs[]?.tabLabel? // empty | contains("connecteddata")))]'
53+
invoke_python "filter_by_verify_action('''$clean_response''')"
5854
}
5955

6056
prompt_user_choice() {
61-
local json_data="$1"
62-
mapfile -t unique_apps < <(echo "$json_data" | jq -r '[.[] | {appId: .appId, applicationName: .tabs[0].extensionData.applicationName}] | unique_by(.appId) | .[] | "\(.appId) \(.applicationName)"')
57+
local json_data="'''$1'''"
58+
mapfile -t unique_apps < <(invoke_python "extract_unique_apps($json_data)")
6359

6460
if [[ -z "$json_data" || "$json_data" == "[]" ]]; then
6561
echo "No data verification were found in the account. Please install a data verification app."
@@ -76,8 +72,8 @@ prompt_user_choice() {
7672

7773
read -p "Enter choice (1-${#unique_apps[@]}): " choice
7874
if [[ "$choice" =~ ^[1-${#unique_apps[@]}]$ ]]; then
79-
chosen_app_id="${unique_apps[$((choice-1))]%% *}"
80-
selected_data=$(echo "$json_data" | jq --arg appId "$chosen_app_id" '[.[] | select(.appId == $appId)]')
75+
chosen_app_id="'${unique_apps[$((choice-1))]%% *}'"
76+
selected_data=$(invoke_python "filter_by_app_id($json_data, $chosen_app_id)")
8177
parse_verification_data "$selected_data"
8278
else
8379
echo "Invalid choice. Exiting."
@@ -86,22 +82,22 @@ prompt_user_choice() {
8682
}
8783

8884
parse_verification_data() {
89-
local clean_json="$1"
90-
91-
app_id=$(echo "$clean_json" | jq -r '.[0].appId')
92-
extension_group_id=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.extensionGroupId')
93-
publisher_name=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.publisherName')
94-
application_name=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.applicationName')
95-
action_name=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.actionName')
96-
action_input_key=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.actionInputKey')
97-
action_contract=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.actionContract')
98-
extension_name=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.extensionName')
99-
extension_contract=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.extensionContract')
100-
required_for_extension=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.requiredForExtension')
101-
tab_label=$(echo "$clean_json" | jq -r '.[0].tabs[].tabLabel')
102-
connection_key=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.connectionInstances[0].connectionKey')
103-
connection_value=$(echo "$clean_json" | jq -r '.[0].tabs[0].extensionData.connectionInstances[0].connectionValue')
85+
local clean_json="'''$1'''"
10486

87+
app_id=$(echo "$clean_json" | invoke_python "get_app_id($clean_json)")
88+
extension_group_id=$(echo "$clean_json" | invoke_python "get_extension_group_id($clean_json)")
89+
publisher_name=$(echo "$clean_json" | invoke_python "get_publisher_name($clean_json)")
90+
application_name=$(echo "$clean_json" | invoke_python "get_application_name($clean_json)")
91+
action_name=$(echo "$clean_json" | invoke_python "get_action_name($clean_json)")
92+
action_input_key=$(echo "$clean_json" | invoke_python "get_action_input_key($clean_json)")
93+
action_contract=$(echo "$clean_json" | invoke_python "get_action_contract($clean_json)")
94+
extension_name=$(echo "$clean_json" | invoke_python "get_extension_name($clean_json)")
95+
extension_contract=$(echo "$clean_json" | invoke_python "get_extension_contract($clean_json)")
96+
required_for_extension=$(echo "$clean_json" | invoke_python "get_required_for_extension($clean_json)")
97+
tab_label=$(echo "$clean_json" | invoke_python "get_tab_label($clean_json)")
98+
connection_key=$(echo "$clean_json" | invoke_python "get_connection_key($clean_json)")
99+
connection_value=$(echo "$clean_json" | invoke_python "get_connection_value($clean_json)")
100+
105101
echo "App ID: $app_id"
106102
echo "Extension Group ID: $extension_group_id"
107103
echo "Publisher Name: $publisher_name"
@@ -140,7 +136,7 @@ doc1_base64=$(mktemp /tmp/eg-001-doc1.XXXXXX)
140136
cat demo_documents/World_Wide_Corp_lorem.pdf | base64 > $doc1_base64
141137

142138
#Construct the request body
143-
#ds-snippet-start:eConnectedFields1Step5
139+
#ds-snippet-start:ConnectedFields1Step5
144140
printf \
145141
'{
146142
"emailSubject": "Please sign this document",
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from json import dumps, loads
2+
3+
def filter_by_verify_action(data: str) -> str:
4+
"""
5+
Filters items where any tab contains 'Verify' in the actionContract.
6+
"""
7+
return dumps([
8+
item for item in loads(data)
9+
if any(
10+
("extensionData" in tab and "actionContract" in tab["extensionData"] and "Verify" in tab["extensionData"]["actionContract"]) or
11+
("tabLabel" in tab and "connecteddata" in tab["tabLabel"])
12+
for tab in item.get("tabs", [])
13+
)
14+
])
15+
16+
def extract_unique_apps(data: str):
17+
"""
18+
Extracts unique appId and applicationName pairs from data.
19+
"""
20+
unique_apps = {}
21+
for item in loads(data):
22+
app_id = item.get('appId', '')
23+
application_name = item.get('tabs', [{}])[0].get('extensionData', {}).get('applicationName', '')
24+
if app_id != '' and application_name != '':
25+
unique_apps[app_id] = application_name
26+
27+
return '\n'.join([f'{app_id} {application_name}' for app_id, application_name in unique_apps.items()])
28+
29+
def filter_by_app_id(data: str, chosen_app_id: str) -> str:
30+
"""
31+
Filters items based on a given appId.
32+
"""
33+
return dumps([item for item in loads(data) if item.get('appId') == chosen_app_id])
34+
35+
def get_app_id(data: str) -> str:
36+
return loads(data)[0].get('appId', '')
37+
38+
def get_extension_group_id(data: str) -> str:
39+
return loads(data)[0]['tabs'][0]['extensionData'].get('extensionGroupId', '')
40+
41+
def get_publisher_name(data: str) -> str:
42+
return loads(data)[0]['tabs'][0]['extensionData'].get('publisherName', '')
43+
44+
def get_application_name(data: str) -> str:
45+
return loads(data)[0]['tabs'][0]['extensionData'].get('applicationName', '')
46+
47+
def get_action_name(data: str) -> str:
48+
return loads(data)[0]['tabs'][0]['extensionData'].get('actionName', '')
49+
50+
def get_action_input_key(data: str) -> str:
51+
return loads(data)[0]['tabs'][0]['extensionData'].get('actionInputKey', '')
52+
53+
def get_action_contract(data: str) -> str:
54+
return loads(data)[0]['tabs'][0]['extensionData'].get('actionContract', '')
55+
56+
def get_extension_name(data: str) -> str:
57+
return loads(data)[0]['tabs'][0]['extensionData'].get('extensionName', '')
58+
59+
def get_extension_contract(data: str) -> str:
60+
return loads(data)[0]['tabs'][0]['extensionData'].get('extensionContract', '')
61+
62+
def get_required_for_extension(data: str) -> str:
63+
return loads(data)[0]['tabs'][0]['extensionData'].get('requiredForExtension', '')
64+
65+
def get_tab_label(data: str) -> str:
66+
return ' '.join([tab['tabLabel'] for tab in loads(data)[0].get('tabs', [])])
67+
68+
def get_connection_key(data: str) -> str:
69+
connection_instances = loads(data)[0]['tabs'][0]['extensionData'].get('connectionInstances', [])
70+
return connection_instances[0].get('connectionKey', '') if len(connection_instances) > 0 else ''
71+
72+
def get_connection_value(data: str) -> str:
73+
connection_instances = loads(data)[0]['tabs'][0]['extensionData'].get('connectionInstances', [])
74+
return connection_instances[0].get('connectionValue', '') if len(connection_instances) > 0 else ''

0 commit comments

Comments
 (0)