Skip to content

Commit de3953e

Browse files
add example
1 parent e852e48 commit de3953e

File tree

9 files changed

+279
-71
lines changed

9 files changed

+279
-71
lines changed

app/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
app.register_blueprint(esignature_views.eg042)
115115
app.register_blueprint(esignature_views.eg043)
116116
app.register_blueprint(esignature_views.eg044)
117+
app.register_blueprint(esignature_views.eg045)
117118

118119
app.register_blueprint(connect_views.cneg001)
119120

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from docusign_esign import FoldersApi, FoldersRequest
2+
3+
from ...docusign import create_api_client
4+
5+
6+
class Eg045DeleteRestoreEnvelopeController:
7+
@staticmethod
8+
def move_envelope(args):
9+
#ds-snippet-start:eSign45Step2
10+
api_client = create_api_client(base_path=args["base_path"], access_token=args["access_token"])
11+
folders_api = FoldersApi(api_client)
12+
#ds-snippet-end:eSign45Step2
13+
14+
#ds-snippet-start:eSign45Step3
15+
folders_request = FoldersRequest(
16+
envelope_ids=[args["envelope_id"]],
17+
18+
# add from_folder_id parameter if its value is provided
19+
**({"from_folder_id": args["from_folder_id"]} if args.get("from_folder_id") else {})
20+
)
21+
#ds-snippet-end:eSign45Step3
22+
23+
#ds-snippet-start:eSign45Step4
24+
results = folders_api.move_envelopes(account_id=args["account_id"], folder_id=args["folder_id"], folders_request=folders_request)
25+
#ds-snippet-end:eSign45Step4
26+
return results

app/eSignature/views/__init__.py

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
1-
from ...eg001_embedded_signing import eg001
2-
from .eg002_signing_via_email import eg002
3-
from .eg003_list_envelopes import eg003
4-
from .eg004_envelope_info import eg004
5-
from .eg005_envelope_recipients import eg005
6-
from .eg006_envelope_docs import eg006
7-
from .eg007_envelope_get_doc import eg007
8-
from .eg008_create_template import eg008
9-
from .eg009_use_template import eg009
10-
from .eg010_send_binary_docs import eg010
11-
from .eg011_embedded_sending import eg011
12-
from .eg012_embedded_console import eg012
13-
from .eg013_add_doc_to_template import eg013
14-
from .eg014_collect_payment import eg014
15-
from .eg015_envelope_tab_data import eg015
16-
from .eg016_set_tab_values import eg016
17-
from .eg017_set_template_tab_values import eg017
18-
from .eg018_envelope_custom_field_data import eg018
19-
from .eg019_access_code_authentication import eg019
20-
from .eg020_phone_authentication import eg020
21-
from .eg022_kba_authentication import eg022
22-
from .eg023_idv_authentication import eg023
23-
from .eg024_permissions_creating import eg024
24-
from .eg025_permissions_set_user_group import eg025
25-
from .eg026_permissions_change_single_setting import eg026
26-
from .eg027_permissions_delete import eg027
27-
from .eg028_brand_creating import eg028
28-
from .eg029_brands_apply_to_envelope import eg029
29-
from .eg030_brands_apply_to_template import eg030
30-
from .eg031_bulk_send import eg031
31-
from .eg032_pause_signature_workflow import eg032
32-
from .eg033_unpause_signature_workflow import eg033
33-
from .eg034_use_conditional_recipients import eg034
34-
from .eg035_scheduled_sending import eg035
35-
from .eg036_delayed_routing import eg036
36-
from .eg037_sms_delivery import eg037
37-
from .eg038_responsive_signing import eg038
38-
from .eg039_in_person_signer import eg039
39-
from .eg040_document_visibility import eg040
40-
from .eg041_cfr_embedded_signing import eg041
41-
from .eg042_document_generation import eg042
42-
from .eg043_shared_access import eg043
43-
from .eg044_focused_view import eg044
1+
from ...eg001_embedded_signing import eg001
2+
from .eg002_signing_via_email import eg002
3+
from .eg003_list_envelopes import eg003
4+
from .eg004_envelope_info import eg004
5+
from .eg005_envelope_recipients import eg005
6+
from .eg006_envelope_docs import eg006
7+
from .eg007_envelope_get_doc import eg007
8+
from .eg008_create_template import eg008
9+
from .eg009_use_template import eg009
10+
from .eg010_send_binary_docs import eg010
11+
from .eg011_embedded_sending import eg011
12+
from .eg012_embedded_console import eg012
13+
from .eg013_add_doc_to_template import eg013
14+
from .eg014_collect_payment import eg014
15+
from .eg015_envelope_tab_data import eg015
16+
from .eg016_set_tab_values import eg016
17+
from .eg017_set_template_tab_values import eg017
18+
from .eg018_envelope_custom_field_data import eg018
19+
from .eg019_access_code_authentication import eg019
20+
from .eg020_phone_authentication import eg020
21+
from .eg022_kba_authentication import eg022
22+
from .eg023_idv_authentication import eg023
23+
from .eg024_permissions_creating import eg024
24+
from .eg025_permissions_set_user_group import eg025
25+
from .eg026_permissions_change_single_setting import eg026
26+
from .eg027_permissions_delete import eg027
27+
from .eg028_brand_creating import eg028
28+
from .eg029_brands_apply_to_envelope import eg029
29+
from .eg030_brands_apply_to_template import eg030
30+
from .eg031_bulk_send import eg031
31+
from .eg032_pause_signature_workflow import eg032
32+
from .eg033_unpause_signature_workflow import eg033
33+
from .eg034_use_conditional_recipients import eg034
34+
from .eg035_scheduled_sending import eg035
35+
from .eg036_delayed_routing import eg036
36+
from .eg037_sms_delivery import eg037
37+
from .eg038_responsive_signing import eg038
38+
from .eg039_in_person_signer import eg039
39+
from .eg040_document_visibility import eg040
40+
from .eg041_cfr_embedded_signing import eg041
41+
from .eg042_document_generation import eg042
42+
from .eg043_shared_access import eg043
43+
from .eg044_focused_view import eg044
44+
from .eg045_delete_restore_envelope import eg045
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
""" Example 045: Delete and Restore an Envelope """
2+
3+
from os import path
4+
5+
from docusign_esign.client.api_exception import ApiException
6+
from flask import render_template, session, Blueprint, request, redirect
7+
8+
from ..examples.eg045_delete_restore_envelope import Eg045DeleteRestoreEnvelopeController
9+
from ...docusign import authenticate, ensure_manifest, get_example_by_number
10+
from ...ds_config import DS_CONFIG
11+
from ...error_handlers import process_error
12+
from ...consts import pattern, API_TYPE
13+
14+
example_number = 45
15+
api = API_TYPE["ESIGNATURE"]
16+
eg = f"eg0{example_number}" # reference (and url) for this example
17+
restore_endpoint = f"{eg}restore"
18+
delete_folder_id = "recyclebin"
19+
restore_folder_id = "sentitems"
20+
eg045 = Blueprint(eg, __name__)
21+
22+
@eg045.route(f"/{eg}", methods=["POST"])
23+
@authenticate(eg=eg, api=api)
24+
@ensure_manifest(manifest_url=DS_CONFIG["example_manifest_url"])
25+
def delete_envelope():
26+
"""
27+
1. Get required arguments
28+
2. Call the worker method
29+
3. Render success response
30+
"""
31+
32+
# 1. Get required arguments
33+
args = {
34+
"account_id": session["ds_account_id"],
35+
"base_path": session["ds_base_path"],
36+
"access_token": session["ds_access_token"],
37+
"envelope_id": pattern.sub("", request.form.get("envelope_id")),
38+
"folder_id": delete_folder_id
39+
}
40+
try:
41+
# 2. Call the worker method
42+
Eg045DeleteRestoreEnvelopeController.move_envelope(args)
43+
except ApiException as err:
44+
return process_error(err)
45+
46+
session["envelope_id"] = args["envelope_id"] # Save for use by second part of example
47+
48+
# 3. Render success response
49+
example = get_example_by_number(session["manifest"], example_number, api)
50+
additional_page_data = next(
51+
(p for p in example["AdditionalPage"] if p["Name"] == "envelope_is_deleted"),
52+
None
53+
)
54+
return render_template(
55+
"example_done.html",
56+
title=example["ExampleName"],
57+
message=additional_page_data["ResultsPageText"],
58+
redirect_url=restore_endpoint
59+
)
60+
61+
@eg045.route(f"/{restore_endpoint}", methods=["POST"])
62+
@authenticate(eg=eg, api=api)
63+
@ensure_manifest(manifest_url=DS_CONFIG["example_manifest_url"])
64+
def restore_envelope():
65+
"""
66+
1. Get required arguments
67+
2. Call the worker method
68+
3. Render success response
69+
"""
70+
71+
# 1. Get required arguments
72+
args = {
73+
"account_id": session["ds_account_id"],
74+
"base_path": session["ds_base_path"],
75+
"access_token": session["ds_access_token"],
76+
"envelope_id": pattern.sub("", session.get("envelope_id")),
77+
"folder_id": restore_folder_id,
78+
"from_folder_id": delete_folder_id
79+
}
80+
try:
81+
# 2. Call the worker method
82+
Eg045DeleteRestoreEnvelopeController.move_envelope(args)
83+
except ApiException as err:
84+
return process_error(err)
85+
86+
# 3. Render success response with envelopeId
87+
example = get_example_by_number(session["manifest"], example_number, api)
88+
return render_template(
89+
"example_done.html",
90+
title=example["ExampleName"],
91+
message=example["ResultsPageText"]
92+
)
93+
94+
@eg045.route(f"/{eg}", methods=["GET"])
95+
@ensure_manifest(manifest_url=DS_CONFIG["example_manifest_url"])
96+
@authenticate(eg=eg, api=api)
97+
def get_view():
98+
"""responds with the form for the example"""
99+
example = get_example_by_number(session["manifest"], example_number, api)
100+
101+
return render_template(
102+
"eSignature/eg045_delete_envelope.html",
103+
title=example["ExampleName"],
104+
example=example,
105+
envelope_id=session.get("envelope_id", ""),
106+
submit_button_text=session["manifest"]["SupportingTexts"]["HelpingTexts"]["SubmitButtonDeleteText"],
107+
source_file="eg045_delete_restore_envelope.py",
108+
source_url=DS_CONFIG["github_example_url"] + "eg045_delete_restore_envelope.py",
109+
documentation=DS_CONFIG["documentation"] + eg,
110+
show_doc=DS_CONFIG["documentation"],
111+
signer_name=DS_CONFIG["signer_name"],
112+
signer_email=DS_CONFIG["signer_email"]
113+
)
114+
115+
@eg045.route(f"/{restore_endpoint}", methods=["GET"])
116+
@ensure_manifest(manifest_url=DS_CONFIG["example_manifest_url"])
117+
@authenticate(eg=eg, api=api)
118+
def get_restore_view():
119+
"""responds with the form for the example"""
120+
example = get_example_by_number(session["manifest"], example_number, api)
121+
122+
if not session.get("envelope_id"):
123+
return redirect(eg)
124+
125+
return render_template(
126+
"eSignature/eg045_restore_envelope.html",
127+
title=example["ExampleName"],
128+
example=example,
129+
envelope_id=session.get("envelope_id"),
130+
submit_button_text=session["manifest"]["SupportingTexts"]["HelpingTexts"]["SubmitButtonRestoreText"],
131+
source_file="eg045_delete_restore_envelope.py",
132+
source_url=DS_CONFIG["github_example_url"] + "eg045_delete_restore_envelope.py",
133+
documentation=DS_CONFIG["documentation"] + eg,
134+
show_doc=DS_CONFIG["documentation"],
135+
signer_name=DS_CONFIG["signer_name"],
136+
signer_email=DS_CONFIG["signer_email"]
137+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!-- extend base layout --> {% extends "base.html" %} {% block content %}
2+
3+
{% include 'example_info.html' %}
4+
5+
{% set form_index = 0 %}
6+
{% set envelope_id_index = 0 %}
7+
8+
<form class="eg" action="" method="post" data-busy="form">
9+
{% if 'FormName' in example['Forms'][form_index] %}
10+
<p>{{ example['Forms'][form_index]['FormName'] | safe }}</p>
11+
{% endif %}
12+
13+
<div class="form-group">
14+
<label for="envelope_id">{{ example['Forms'][form_index]['Inputs'][envelope_id_index]['InputName'] }}</label>
15+
<input type="text" class="form-control" id="envelope_id" name="envelope_id"
16+
aria-describedby="envelope_id_help" placeholder="{{ example['Forms'][form_index]['Inputs'][envelope_id_index]['InputPlaceholder'] }}" required
17+
value="{{ envelope_id }}" />
18+
<small id="envelope_id_help" class="form-text text-muted">{{ session['manifest']['SupportingTexts']['HelpingTexts']['DefaultEnvelopeId'] | safe}}</small>
19+
</div>
20+
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
21+
{% include 'submit_button.html' %}
22+
</form>
23+
24+
{% endblock %}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<!-- extend base layout --> {% extends "base.html" %} {% block content %}
2+
3+
<h4>{{ title }}</h4>
4+
<p>{{ example["ExampleDescription"] | safe }}</p>
5+
<p>{{ session["manifest"]["SupportingTexts"]["HelpingTexts"]["EnvelopeWillBeRestored"].format(envelope_id) | safe }}</p>
6+
7+
{% set form_index = 0 %}
8+
{% set envelope_id_index = 0 %}
9+
10+
<form class="eg" action="" method="post" data-busy="form">
11+
{% if 'FormName' in example['Forms'][recipient_form_index] %}
12+
<p>{{ example['Forms'][recipient_form_index]['FormName'] | safe }}</p>
13+
{% endif %}
14+
15+
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
16+
{% include 'submit_button.html' %}
17+
</form>
18+
19+
{% endblock %}

app/templates/example_info.html

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
<h4>{{ title }}</h4>
2-
<p>{{ example["ExampleDescription"] | safe }}</p>
3-
4-
{% if show_doc %}
5-
<p><a target='_blank' href='{{ documentation | safe }}'>Documentation</a> about this example.</p>
6-
{% endif %}
7-
8-
{% if "Note" in example %}
9-
<p>{{ example["Note"] | safe }}</p>
10-
{% endif %}
11-
12-
{% if example["LinksToAPIMethod"] | length > 0 %}
13-
{% if example["LinksToAPIMethod"] | length > 1 %}
14-
{{ session["manifest"]["SupportingTexts"]["APIMethodUsedPlural"] | safe }}
15-
{% else %}
16-
{{ session["manifest"]["SupportingTexts"]["APIMethodUsed"] | safe }}
17-
{% endif %}
18-
19-
{% for link in example["LinksToAPIMethod"] -%}
20-
<a target='_blank' href="{{ link['Path'] }}">{{ link['PathName'] }}</a>
21-
{% endfor %}
22-
{% endif %}
23-
24-
<p>
25-
View source file <a target="_blank" href="{{ source_url | safe }}">{{ source_file }}</a> on GitHub.
26-
</p>
1+
<h4>{{ title }}</h4>
2+
<p>{{ example["ExampleDescription"] | safe }}</p>
3+
4+
{% if show_doc %}
5+
<p><a target='_blank' href='{{ documentation | safe }}'>Documentation</a> about this example.</p>
6+
{% endif %}
7+
8+
{% if "Notes" in example %}
9+
<p>{{ example["Notes"] | safe }}</p>
10+
{% endif %}
11+
12+
{% if example["LinksToAPIMethod"] | length > 0 %}
13+
{% if example["LinksToAPIMethod"] | length > 1 %}
14+
{{ session["manifest"]["SupportingTexts"]["APIMethodUsedPlural"] | safe }}
15+
{% else %}
16+
{{ session["manifest"]["SupportingTexts"]["APIMethodUsed"] | safe }}
17+
{% endif %}
18+
19+
{% for link in example["LinksToAPIMethod"] -%}
20+
<a target='_blank' href="{{ link['Path'] }}">{{ link['PathName'] }}</a>
21+
{% endfor %}
22+
{% endif %}
23+
24+
<p>
25+
View source file <a target="_blank" href="{{ source_url | safe }}">{{ source_file }}</a> on GitHub.
26+
</p>

app/templates/submit_button.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<button type="submit" class="btn btn-docu">{{ session['manifest']['SupportingTexts']['SubmitButton'] }}</button>
1+
<button type="submit" class="btn btn-docu">{{ submit_button_text if submit_button_text else session['manifest']['SupportingTexts']['SubmitButton'] }}</button>

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ cffi==1.17.1
44
chardet==5.2.0
55
Click
66
cryptography==45.0.3
7-
docusign-esign==5.0.0
7+
docusign-esign==5.3.0
88
docusign-rooms==1.3.0
99
docusign-monitor==1.2.0
1010
docusign-click==1.4.0

0 commit comments

Comments
 (0)