Skip to content

Commit eff67c4

Browse files
Merge pull request #270 from getyoti/release/2.14.0
Release 2.14.0
2 parents fa6337e + 1ceff9f commit eff67c4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1175
-52
lines changed

.github/dependabot.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ updates:
33
- package-ecosystem: pip
44
directory: "/"
55
schedule:
6-
interval: daily
6+
interval: monthly
77
open-pull-requests-limit: 3
88
target-branch: development
99
reviewers:

examples/doc_scan/app.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
RequestedIDDocumentComparisonCheckBuilder,
88
RequestedLivenessCheckBuilder,
99
RequestedTextExtractionTaskBuilder,
10+
RequestedSupplementaryDocTextExtractionTaskBuilder,
1011
SdkConfigBuilder,
1112
SessionSpecBuilder,
1213
)
@@ -15,6 +16,10 @@
1516
RequiredIdDocumentBuilder,
1617
DocumentRestrictionBuilder,
1718
DocumentRestrictionsFilterBuilder,
19+
RequiredSupplementaryDocumentBuilder,
20+
)
21+
from yoti_python_sdk.doc_scan.session.create.objective import (
22+
ProofOfAddressObjectiveBuilder,
1823
)
1924

2025
from .settings import YOTI_APP_BASE_URL, YOTI_CLIENT_SDK_ID, YOTI_KEY_FILE_PATH
@@ -52,7 +57,7 @@ def create_session():
5257
.with_user_tracking_id("some-user-tracking-id")
5358
.with_requested_check(
5459
RequestedDocumentAuthenticityCheckBuilder()
55-
.with_manual_check_never()
60+
.with_manual_check_always()
5661
.build()
5762
)
5863
.with_requested_check(
@@ -62,19 +67,27 @@ def create_session():
6267
.build()
6368
)
6469
.with_requested_check(
65-
RequestedFaceMatchCheckBuilder().with_manual_check_never().build()
70+
RequestedFaceMatchCheckBuilder().with_manual_check_always().build()
6671
)
6772
.with_requested_check(RequestedIDDocumentComparisonCheckBuilder().build())
6873
.with_requested_task(
6974
RequestedTextExtractionTaskBuilder()
70-
.with_manual_check_never()
75+
.with_manual_check_always()
7176
.with_chip_data_desired()
7277
.build()
7378
)
79+
.with_requested_task(
80+
RequestedSupplementaryDocTextExtractionTaskBuilder()
81+
.with_manual_check_always()
82+
.build()
83+
)
7484
.with_sdk_config(sdk_config)
7585
.with_required_document(build_required_id_document_restriction("PASSPORT"))
86+
.with_required_document(RequiredIdDocumentBuilder().build())
7687
.with_required_document(
77-
build_required_id_document_restriction("DRIVING_LICENCE")
88+
RequiredSupplementaryDocumentBuilder()
89+
.with_objective(ProofOfAddressObjectiveBuilder().build())
90+
.build()
7891
)
7992
.build()
8093
)
@@ -98,7 +111,7 @@ def index():
98111
try:
99112
result = create_session()
100113
except DocScanException as e:
101-
return render_template("error.html", error=e.text)
114+
return render_template("error.html", error=e.message)
102115

103116
session["doc_scan_session_id"] = result.session_id
104117

@@ -120,7 +133,7 @@ def success():
120133
try:
121134
session_result = doc_scan_client.get_session(session_id)
122135
except DocScanException as e:
123-
return render_template("error.html", error=e.text)
136+
return render_template("error.html", error=e.message)
124137

125138
return render_template("success.html", session_result=session_result)
126139

@@ -150,7 +163,10 @@ def media():
150163
try:
151164
retrieved_media = doc_scan_client.get_media_content(session_id, media_id)
152165
except DocScanException as e:
153-
return render_template("error.html", error=e.text)
166+
return render_template("error.html", error=e.message)
167+
168+
if retrieved_media is None:
169+
return Response("", status=204)
154170

155171
return Response(
156172
retrieved_media.content, content_type=retrieved_media.mime_type, status=200

examples/doc_scan/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ certifi==2020.4.5.1 # via requests
99
cffi==1.14.0 # via cryptography
1010
chardet==3.0.4 # via requests
1111
click==7.1.2 # via flask
12-
cryptography==2.9.2 # via pyopenssl, yoti
12+
cryptography==3.2 # via pyopenssl, yoti
1313
deprecated==1.2.10 # via yoti
1414
filetype==1.0.7 # via -r requirements.in
1515
flask==1.1.2 # via -r requirements.in

examples/doc_scan/templates/success.html

Lines changed: 213 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,20 @@ <h3 class="mb-0">
7373
</div>
7474
</div>
7575
{% endif %}
76-
{% if session_result.text_data_checks|length > 0 %}
76+
{% if session_result.id_document_text_data_checks|length > 0 %}
7777
<div class="card">
7878
<div class="card-header" id="text-data-checks">
7979
<h3 class="mb-0">
8080
<button class="btn btn-link" type="button" data-toggle="collapse"
8181
data-target="#collapse-text-data-checks" aria-expanded="true"
8282
aria-controls="collapse-text-data-checks">
83-
Text Data Checks
83+
ID Document Text Data Checks
8484
</button>
8585
</h3>
8686
</div>
8787
<div id="collapse-text-data-checks" class="collapse" aria-labelledby="text-data-checks">
8888
<div class="card-body">
89-
{% for check in session_result.text_data_checks %}
89+
{% for check in session_result.id_document_text_data_checks %}
9090
{% with check=check %}
9191
{% include "partials/check.html" %}
9292
{% endwith %}
@@ -163,6 +163,29 @@ <h3 class="mb-0">
163163
</div>
164164
</div>
165165
{% endif %}
166+
167+
{% if session_result.supplementary_document_text_data_checks|length > 0 %}
168+
<div class="card">
169+
<div class="card-header" id="sup-doc-text-data-checks">
170+
<h3 class="mb-0">
171+
<button class="btn btn-link" type="button" data-toggle="collapse"
172+
data-target="#collapse-sup-doc-text-data-checks" aria-expanded="true"
173+
aria-controls="collapse-sup-doc-text-data-checks">
174+
Supplementary Document Text Data Checks
175+
</button>
176+
</h3>
177+
</div>
178+
<div id="collapse-sup-doc-text-data-checks" class="collapse" aria-labelledby="sup-doc-text-data-checks">
179+
<div class="card-body">
180+
{% for check in session_result.supplementary_document_text_data_checks %}
181+
{% with check=check %}
182+
{% include "partials/check.html" %}
183+
{% endwith %}
184+
{% endfor %}
185+
</div>
186+
</div>
187+
</div>
188+
{% endif %}
166189
</div>
167190
</div>
168191
</div>
@@ -360,6 +383,193 @@ <h5 class="card-title">Frame</h5>
360383
{% endfor %}
361384
{% endwith %}
362385

386+
{% if session_result.resources.supplementary_documents|length > 0 %}
387+
<div class="row pt-4">
388+
<div class="col">
389+
<h2>Supplementary Documents</h2>
390+
</div>
391+
</div>
392+
{% endif %}
393+
394+
{% with doc_num=0 %}
395+
{% for document in session_result.resources.supplementary_documents %}
396+
{% set doc_num = loop.index %}
397+
<div class="row pt-4">
398+
<div class="col">
399+
400+
<h3>
401+
{{ document.document_type }} <span
402+
class="badge badge-primary">{{ document.issuing_country }}</span>
403+
</h3>
404+
405+
<div class="accordion mt-3">
406+
{% if document.document_fields is not none %}
407+
<div class="card">
408+
<div class="card-header" id="sup-doc-fields-{{ doc_num }}">
409+
<h4 class="mb-0">
410+
<button class="btn btn-link" type="button" data-toggle="collapse"
411+
data-target="#collapse-sup-doc-fields-{{ doc_num }}"
412+
aria-expanded="true"
413+
aria-controls="collapse-sup-doc-fields-{{ doc_num }}">
414+
Document Fields
415+
</button>
416+
</h4>
417+
</div>
418+
<div id="collapse-sup-doc-fields-{{ doc_num }}" class="collapse"
419+
aria-labelledby="sup-doc-fields-{{ doc_num }}">
420+
<div class="card-body">
421+
{% if document.document_fields.media is not none %}
422+
<h5>Media</h5>
423+
<table class="table table-striped table-light">
424+
<tbody>
425+
<tr>
426+
<td>ID</td>
427+
<td>
428+
<a href="/media?mediaId={{ document.document_fields.media.id }}">
429+
{{ document.document_fields.media.id }}
430+
</a>
431+
</td>
432+
</tr>
433+
</tbody>
434+
</table>
435+
{% endif %}
436+
</div>
437+
</div>
438+
</div>
439+
{% endif %}
440+
441+
{% if document.document_file is not none %}
442+
{% if document.document_file.media is not none %}
443+
<div class="card">
444+
<div class="card-header" id="sup-doc-file-{{ doc_num }}">
445+
<h4 class="mb-0">
446+
<a class="btn btn-link" href="/media?mediaId={{ document.document_file.media.id }}">
447+
Download File
448+
</a>
449+
</h4>
450+
</div>
451+
</div>
452+
{% endif %}
453+
{% endif %}
454+
455+
{% if document.text_extraction_tasks|length > 0 %}
456+
<div class="card">
457+
<div class="card-header" id="text-extraction-tasks-{{ doc_num }}">
458+
<h4 class="mb-0">
459+
<button class="btn btn-link" type="button" data-toggle="collapse"
460+
data-target="#collapse-text-extraction-tasks-{{ doc_num }}"
461+
aria-expanded="true"
462+
aria-controls="collapse-text-extraction-tasks-{{ doc_num }}">
463+
Text Extraction Tasks
464+
</button>
465+
</h4>
466+
</div>
467+
<div id="collapse-text-extraction-tasks-{{ doc_num }}" class="collapse"
468+
aria-labelledby="text-extraction-tasks-{{ doc_num }}">
469+
<div class="card-body">
470+
{% for task in document.text_extraction_tasks %}
471+
472+
{% with task=task %}
473+
{% include "partials/task.html" %}
474+
{% endwith %}
475+
476+
{% if task.generated_text_data_checks|length > 0 %}
477+
<h5>Generated Text Data Checks</h5>
478+
479+
{% for generated_check in task.generated_text_data_checks %}
480+
<table class="table table-striped">
481+
<tbody>
482+
<tr>
483+
<td>ID</td>
484+
<td>{{ generated_check.id }}</td>
485+
</tr>
486+
</tbody>
487+
</table>
488+
{% endfor %}
489+
{% endif %}
490+
491+
{% if task.generated_media|length > 0 %}
492+
<h5>Generated Media</h5>
493+
494+
{% for generated_media in task.generated_media %}
495+
<table class="table table-striped">
496+
<tbody>
497+
<tr>
498+
<td>ID</td>
499+
<td>
500+
<a href="/media?mediaId={{ generated_media.id }}">{{ generated_media.id }}</a>
501+
</td>
502+
</tr>
503+
<tr>
504+
<td>Type</td>
505+
<td>{{ generated_media.type }}</td>
506+
</tr>
507+
</tbody>
508+
</table>
509+
{% endfor %}
510+
{% endif %}
511+
{% endfor %}
512+
</div>
513+
</div>
514+
</div>
515+
{% endif %}
516+
517+
{% if document.pages|length > 0 %}
518+
{% with page_num=0 %}
519+
{% for page in document.pages %}
520+
{% set page_num = loop.index %}
521+
<div class="card">
522+
<div class="card-header" id="sup-doc-pages-{{ doc_num }}-{{ page_num }}">
523+
<h4 class="mb-0">
524+
<button class="btn btn-link" type="button" data-toggle="collapse"
525+
data-target="#collapse-sup-doc-pages-{{ doc_num }}-{{ page_num }}"
526+
aria-expanded="true"
527+
aria-controls="collapse-sup-doc-pages-{{ doc_num }}-{{ page_num }}">
528+
Page {{ page_num }}
529+
</button>
530+
</h4>
531+
</div>
532+
<div id="collapse-sup-doc-pages-{{ doc_num }}-{{ page_num }}" class="collapse"
533+
aria-labelledby="sup-doc-pages-{{ doc_num }}-{{ page_num }}">
534+
535+
<div class="card-group">
536+
{% if page.media is not none %}
537+
<div class="card" style="width: 18rem;">
538+
<img class="card-img-top"
539+
src="/media?mediaId={{ page.media.id }}"/>
540+
<div class="card-body">
541+
<p>Method: {{ page.capture_method }}</p>
542+
</div>
543+
</div>
544+
{% endif %}
545+
</div>
546+
547+
{% if page.frames|length > 0 %}
548+
<div class="card-group">
549+
{% for frame in page.frames %}
550+
{% if frame.media is not none %}
551+
<div class="card">
552+
<img class="card-img-top" src="/media?mediaId={{ frame.media.id }}" />
553+
<div class="card-body">
554+
<h5 class="card-title">Frame</h5>
555+
</div>
556+
</div>
557+
{% endif %}
558+
{% endfor %}
559+
</div>
560+
{% endif %}
561+
562+
</div>
563+
</div>
564+
{% endfor %}
565+
{% endwith %}
566+
{% endif %}
567+
</div>
568+
</div>
569+
</div>
570+
{% endfor %}
571+
{% endwith %}
572+
363573
{% if session_result.resources.zoom_liveness_resources|length > 0 %}
364574
<div class="row pt-4">
365575
<div class="col">

examples/yoti_example_django/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ asn1==2.2.0 # via yoti
99
certifi==2018.4.16 # via requests
1010
cffi==1.14.0 # via cryptography
1111
chardet==3.0.4 # via requests
12-
cryptography==2.9.2 # via pyopenssl, yoti
12+
cryptography==3.2 # via pyopenssl, yoti
1313
deprecated==1.2.10 # via yoti
1414
django-sslserver==0.22 # via -r requirements.in
1515
django==3.0.7 # via -r requirements.in, django-sslserver

examples/yoti_example_flask/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ certifi==2018.4.16 # via requests
99
cffi==1.14.0 # via -r requirements.in, cryptography
1010
chardet==3.0.4 # via requests
1111
click==6.7 # via flask
12-
cryptography==2.9.2 # via pyopenssl, yoti
12+
cryptography==3.2 # via pyopenssl, yoti
1313
deprecated==1.2.10 # via yoti
1414
flask==1.1.1 # via -r requirements.in
1515
future==0.16.0 # via yoti

requirements.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pbr==1.10.0
77
protobuf==3.13.0
88
pyopenssl==19.1.0
99
PyYAML==5.2 # PyYAML 5.3 does not support Python 3.4
10-
pytz==2020.1
10+
pytz==2020.4
1111
requests>=2.20.0
1212
urllib3>=1.24.3
1313
deprecated==1.2.10

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pbr==1.10.0 # via -r requirements.in
1818
protobuf==3.13.0 # via -r requirements.in
1919
pycparser==2.18 # via cffi
2020
pyopenssl==19.1.0 # via -r requirements.in
21-
pytz==2020.1 # via -r requirements.in
21+
pytz==2020.4 # via -r requirements.in
2222
pyyaml==5.2 # via -r requirements.in
2323
requests==2.21.0 # via -r requirements.in
2424
six==1.10.0 # via cryptography, protobuf, pyopenssl

0 commit comments

Comments
 (0)