scout-browser 4.90__py3-none-any.whl → 4.91__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scout/__version__.py +1 -1
- scout/adapter/mongo/case.py +27 -38
- scout/commands/export/variant.py +14 -4
- scout/commands/load/panel.py +2 -1
- scout/commands/update/panelapp.py +11 -3
- scout/commands/view/case.py +2 -2
- scout/constants/__init__.py +1 -2
- scout/constants/acmg.py +15 -15
- scout/constants/case_tags.py +0 -46
- scout/constants/clnsig.py +2 -1
- scout/constants/gene_tags.py +0 -6
- scout/constants/panels.py +16 -0
- scout/constants/variants_export.py +2 -0
- scout/demo/__init__.py +4 -1
- scout/demo/panelapp_panel.json +463 -0
- scout/demo/panelapp_panels_reduced.json +37 -0
- scout/load/panel.py +3 -142
- scout/load/panelapp.py +138 -0
- scout/models/case/case_loading_models.py +5 -4
- scout/parse/matchmaker.py +18 -6
- scout/parse/panel.py +3 -117
- scout/parse/panelapp.py +112 -0
- scout/parse/variant/clnsig.py +26 -21
- scout/parse/variant/genotype.py +6 -5
- scout/server/blueprints/alignviewers/controllers.py +7 -5
- scout/server/blueprints/alignviewers/templates/alignviewers/utils.html +1 -1
- scout/server/blueprints/cases/templates/cases/case_sma.html +49 -42
- scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +27 -12
- scout/server/blueprints/cases/views.py +18 -7
- scout/server/blueprints/clinvar/templates/clinvar/clinvar_submissions.html +7 -7
- scout/server/blueprints/clinvar/templates/clinvar/multistep_add_variant.html +2 -2
- scout/server/blueprints/dashboard/controllers.py +128 -165
- scout/server/blueprints/dashboard/forms.py +3 -13
- scout/server/blueprints/dashboard/templates/dashboard/dashboard_general.html +17 -22
- scout/server/blueprints/institutes/forms.py +1 -2
- scout/server/blueprints/institutes/templates/overview/cases.html +2 -133
- scout/server/blueprints/institutes/templates/overview/utils.html +135 -0
- scout/server/blueprints/omics_variants/templates/omics_variants/outliers.html +5 -0
- scout/server/blueprints/panels/templates/panels/panel.html +5 -1
- scout/server/blueprints/panels/templates/panels/panel_pdf_simple.html +5 -1
- scout/server/blueprints/variant/controllers.py +6 -1
- scout/server/blueprints/variant/templates/variant/buttons.html +11 -10
- scout/server/blueprints/variant/templates/variant/components.html +63 -44
- scout/server/blueprints/variant/templates/variant/str-variant-reviewer.html +1 -1
- scout/server/blueprints/variant/templates/variant/utils.html +38 -10
- scout/server/blueprints/variant/templates/variant/variant.html +1 -1
- scout/server/blueprints/variants/controllers.py +9 -4
- scout/server/blueprints/variants/templates/variants/cancer-sv-variants.html +9 -5
- scout/server/blueprints/variants/templates/variants/cancer-variants.html +6 -17
- scout/server/blueprints/variants/templates/variants/str-variants.html +2 -2
- scout/server/blueprints/variants/templates/variants/sv-variants.html +8 -1
- scout/server/blueprints/variants/templates/variants/utils.html +14 -0
- scout/server/extensions/__init__.py +2 -0
- scout/server/extensions/panelapp_extension.py +75 -0
- scout/server/links.py +19 -1
- scout/server/utils.py +25 -33
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/METADATA +1 -1
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/RECORD +62 -58
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/WHEEL +1 -1
- scout/demo/panelapp_test_panel.json +0 -79
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/LICENSE +0 -0
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/entry_points.txt +0 -0
- {scout_browser-4.90.dist-info → scout_browser-4.91.dist-info}/top_level.txt +0 -0
@@ -30,61 +30,68 @@
|
|
30
30
|
<div class="card col-md-12">
|
31
31
|
<h4 class="mt-3">Case: {{case.display_name}}</h4>
|
32
32
|
<div class="card-body">
|
33
|
-
|
34
33
|
<div class="row">
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
</div>
|
34
|
+
<div class="col-xs-12 col-md-12">{{ smn_individuals_table(case, institute, tissue_types) }}</div>
|
35
|
+
</div> <!-- end of div class row -->
|
36
|
+
<div class="row">
|
37
|
+
<div class="col-md-4">
|
38
|
+
{% if case.madeline_info and case.individuals|length > 1 %}
|
39
|
+
{{ pedigree_panel() }}
|
40
|
+
{% else %}
|
41
|
+
<p>No pedigree picture available.</p>
|
42
|
+
{% endif %}
|
43
|
+
</div>
|
44
|
+
<div class="col-md-8">
|
45
|
+
{{ synopsis_panel() }}
|
46
|
+
<div class="panel-default">
|
47
|
+
{{ comments_panel(institute, case, current_user, comments) }}
|
50
48
|
</div>
|
51
|
-
</div>
|
49
|
+
</div>
|
50
|
+
</div> <!-- end of div class row -->
|
52
51
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
52
|
+
<span class="d-flex">
|
53
|
+
{% if case.vcf_files.vcf_snv %}
|
54
|
+
<span class="me-3">
|
55
|
+
<form action="{{url_for('variants.variants', institute_id=institute._id, case_name=case.display_name) }}">
|
56
|
+
<input type="hidden" id="hgnc_symbols" name="hgnc_symbols" value="SMN1, SMN2"></input>
|
57
|
+
<input type="hidden" id="gene_panels" name="gene_panels" value="['']"></input>
|
58
|
+
<span><button type="submit" class="btn btn-secondary btn-sm" target="_blank" rel="noopener" data-bs-toggle="tooltip" title="SNV and INDEL variants view filtered for the genes SMN1 and SMN2">SNVs</button></span>
|
59
|
+
</form>
|
60
|
+
</span>
|
61
|
+
{% endif %}
|
62
|
+
{% if case.vcf_files.vcf_sv %}
|
64
63
|
<span class="me-3">
|
65
64
|
<form action="{{url_for('variants.sv_variants', institute_id=institute._id, case_name=case.display_name) }}">
|
66
65
|
<input type="hidden" id="hgnc_symbols" name="hgnc_symbols" value="SMN1, SMN2"></input>
|
67
66
|
<input type="hidden" id="gene_panels" name="gene_panels" value="['']"></input>
|
68
|
-
<button type="submit" class="btn btn-secondary btn-sm" target="_blank" rel="noopener" data-bs-toggle="tooltip" title="Structural variants view filtered for the genes SMN1 and SMN2">SVs</button
|
67
|
+
<button type="submit" class="btn btn-secondary btn-sm" target="_blank" rel="noopener" data-bs-toggle="tooltip" title="Structural variants view filtered for the genes SMN1 and SMN2">SVs</button>
|
69
68
|
</form>
|
70
69
|
</span>
|
71
|
-
|
72
|
-
{% if case.bam_files %}
|
73
|
-
<span class="me-3"><a class="btn btn-secondary btn-sm text-white" href="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name'], chrom=region['smn1']['chrom'], start=region['smn1']['start'], stop=region['smn1']['end'] )}}" target="_blank">IGV viewer SMN1</a></span>
|
74
|
-
<span class="me-3"><a class="btn btn-secondary btn-sm text-white" href="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name'], chrom=region['smn2']['chrom'], start=region['smn2']['start'], stop=region['smn2']['end'] )}}" target="_blank">IGV viewer SMN2</a></span>
|
75
|
-
{% else %}
|
76
|
-
<span class="me-3 text-muted">BAM file(s) missing</span>
|
77
|
-
{% endif %}
|
78
|
-
</div>
|
70
|
+
{% endif %}
|
79
71
|
|
80
|
-
<
|
81
|
-
|
82
|
-
|
72
|
+
<span class="me-3"
|
73
|
+
{% if not case.bam_files %}title="Alignment file(s) missing" data-bs-toggle="tooltip"{% endif %}>
|
74
|
+
<a href="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name'], chrom=region['smn1']['chrom'], start=region['smn1']['start'], stop=region['smn1']['end'] )}}" target="_blank"
|
75
|
+
class="btn btn-secondary btn-sm text-white{% if not case.bam_files %} disabled{% endif %}">
|
76
|
+
IGV DNA SMN1
|
77
|
+
</a>
|
78
|
+
</span>
|
79
|
+
<span class="me-3"
|
80
|
+
{% if not case.bam_files %}title="Alignment file(s) missing" data-bs-toggle="tooltip"{% endif %}>
|
81
|
+
<a href="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name'], chrom=region['smn2']['chrom'], start=region['smn2']['start'], stop=region['smn2']['end'] )}}" target="_blank"
|
82
|
+
class="btn btn-secondary btn-sm text-white{% if not case.bam_files %} disabled{% endif %}">
|
83
|
+
IGV DNA SMN2
|
84
|
+
</a>
|
85
|
+
</span>
|
86
|
+
</span>
|
83
87
|
|
84
|
-
|
88
|
+
<div class="row">
|
89
|
+
<div class="col-sm-12">{{activity_panel(events)}}</div>
|
90
|
+
</div>
|
91
|
+
|
92
|
+
{{ modal_synopsis() }}
|
85
93
|
</div> <!-- end of card body -->
|
86
94
|
</div> <!-- end of card div-->
|
87
|
-
</div>
|
88
95
|
</div> <!-- end of div class col -->
|
89
96
|
{% endmacro %}
|
90
97
|
|
@@ -197,22 +197,37 @@
|
|
197
197
|
<span class="menu-collapsed">Genome build {{ case.genome_build }}</span>
|
198
198
|
</div>
|
199
199
|
</div>
|
200
|
-
<div href="#" class="bg-dark list-group-item d-inline-block text-white"
|
201
|
-
|
200
|
+
<div href="#" class="bg-dark list-group-item d-inline-block text-white"
|
201
|
+
{% if not case.bam_files %} data-bs-toggle="tooltip" title="Alignment file(s) missing" {% endif %}>
|
202
202
|
<form action="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name']) }}" target="_blank" rel="noopener">
|
203
|
-
<button
|
203
|
+
<button type="submit" class="btn btn-xs form-control btn-secondary"
|
204
|
+
{% if not case.bam_files %}
|
205
|
+
disabled="disabled"><span class="fa fa-times-circle fa-fw me-1"></span>
|
206
|
+
{% else %}><span class="fa fa-magnifying-glass fa-fw me-1"></span>
|
207
|
+
{% endif %}
|
208
|
+
<span class="menu-collapsed">IGV g</span>D<span class="menu-collapsed">NA</span>
|
209
|
+
</button>
|
204
210
|
</form>
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
211
|
+
</div>
|
212
|
+
<div href="#" class="bg-dark list-group-item d-inline-block text-white"
|
213
|
+
{% if not case.mt_bams %} data-bs-toggle="tooltip" title="Alignment file(s) missing" {% endif %}>
|
214
|
+
<form action="{{url_for('alignviewers.igv', institute_id=case['owner'], case_name=case['display_name'], chrom='M', start=1, stop=16569) }}" target="_blank" rel="noopener">
|
215
|
+
<button type="submit" class="btn btn-xs form-control btn-secondary"
|
216
|
+
{% if not case.mt_bams %}
|
217
|
+
disabled="disabled"><span class="fa fa-times-circle fa-fw me-1"></span>
|
218
|
+
{% else %}
|
219
|
+
><span class="fa fa-magnifying-glass fa-fw me-1"></span>
|
220
|
+
{% endif %}
|
221
|
+
<span class="menu-collapsed">IGV </span>m<span class="menu-collapsed">tDNA</span></button>
|
213
222
|
</form>
|
214
223
|
</div>
|
215
|
-
{%
|
224
|
+
{% if has_rna_tracks %}
|
225
|
+
<div href="#" class="bg-dark list-group-item d-inline-block text-white">
|
226
|
+
<form action="{{url_for('alignviewers.sashimi_igv', institute_id=case['owner'], case_name=case['display_name']) }}" target="_blank" rel="noopener">
|
227
|
+
<button type="submit" class="btn btn-xs form-control btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" title="Available in build GRCh{{ case.rna_genome_build or '38' }}"><span class="fa fa-magnifying-glass fa-fw me-1"></span><span class="menu-collapsed">IGV </span>R<span class="menu-collapsed">NA</span></button>
|
228
|
+
</form>
|
229
|
+
</div>
|
230
|
+
{% endif %}
|
216
231
|
{% endmacro %}
|
217
232
|
|
218
233
|
{% macro rank_model(case) %}
|
@@ -25,6 +25,8 @@ from flask import (
|
|
25
25
|
url_for,
|
26
26
|
)
|
27
27
|
from flask_login import current_user
|
28
|
+
from pymongo.errors import OperationFailure
|
29
|
+
from werkzeug.datastructures import ImmutableMultiDict
|
28
30
|
|
29
31
|
from scout.constants import DATE_DAY_FORMATTER
|
30
32
|
from scout.server.blueprints.variants.controllers import activate_case
|
@@ -619,7 +621,13 @@ def caselist(institute_id):
|
|
619
621
|
if query is None:
|
620
622
|
return abort(500)
|
621
623
|
|
622
|
-
|
624
|
+
name_query = ImmutableMultiDict(
|
625
|
+
{
|
626
|
+
"case": query,
|
627
|
+
}
|
628
|
+
)
|
629
|
+
|
630
|
+
matching_cases = store.cases(owner=institute_id, name_query=name_query)
|
623
631
|
display_names = []
|
624
632
|
if institute_id: # called from case page, where institute_id is provided
|
625
633
|
display_names = sorted([case["display_name"] for case in matching_cases])
|
@@ -643,13 +651,16 @@ def hpoterms():
|
|
643
651
|
query = request.args.get("query")
|
644
652
|
if query is None:
|
645
653
|
return abort(500)
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
654
|
+
try:
|
655
|
+
terms = sorted(store.hpo_terms(query=query), key=itemgetter("hpo_number"))
|
656
|
+
json_terms = [
|
657
|
+
{"name": "{} | {}".format(term["_id"], term["description"]), "id": term["_id"]}
|
658
|
+
for term in terms[:7]
|
659
|
+
]
|
651
660
|
|
652
|
-
|
661
|
+
return jsonify(json_terms)
|
662
|
+
except OperationFailure as of:
|
663
|
+
return jsonify({"error": of._message})
|
653
664
|
|
654
665
|
|
655
666
|
@cases_bp.route("/api/v1/disease-terms")
|
@@ -101,8 +101,8 @@
|
|
101
101
|
{% endif %}
|
102
102
|
{% if subm_obj.status == 'submitted' %} <!--Submission status query -->
|
103
103
|
<form id="statusApi_{{subm_obj._id}}" action="{{ url_for('clinvar.clinvar_submission_status', submission_id=subm_obj.clinvar_subm_id) }}" method="POST">
|
104
|
-
{{ status_modal() }}
|
105
|
-
<td style="width: 20%"><button type="button" class="btn btn-sm btn-secondary form-control" name="status_enquiry" value="api_status" data-bs-toggle="modal" data-bs-target="#
|
104
|
+
{{ status_modal(subm_obj._id) }}
|
105
|
+
<td style="width: 20%"><button type="button" class="btn btn-sm btn-secondary form-control" name="status_enquiry" value="api_status" data-bs-toggle="modal" data-bs-target="#statusModal_{{subm_obj._id}}">Submission status enquiry</button></td>
|
106
106
|
</form>
|
107
107
|
{% endif %}
|
108
108
|
</tr>
|
@@ -156,7 +156,7 @@
|
|
156
156
|
<td><a href="{{ url_for('cases.case', institute_id=institute._id, case_name=subm_obj.cases[subm_variant.case_id]) }}" target="_blank" rel="noopener">{{subm_obj.cases[subm_variant.case_id]}}</a></td>
|
157
157
|
<td>{{subm_variant.ref_seq or '-'}}</td>
|
158
158
|
<td>{{subm_variant.gene_symbol or '-'}}</td>
|
159
|
-
<td>{{subm_variant.hgvs|truncate(
|
159
|
+
<td>{{subm_variant.hgvs|truncate(100,true,'..') or '-'}}</td>
|
160
160
|
<td>{{subm_variant.clinsig}}</td>
|
161
161
|
<td>{{subm_variant.added_by or "N/A"}}</td>
|
162
162
|
<form id="delete_variant_{{subm_variant._id}}" action="{{ url_for('clinvar.clinvar_delete_object', submission=subm_obj._id, object_type='variant_data') }}" method="POST">
|
@@ -170,7 +170,7 @@
|
|
170
170
|
<ul class="list-group">
|
171
171
|
{% for key, value in variant_header_fields.items() %}
|
172
172
|
{% if subm_variant[key]%}
|
173
|
-
<li class="list-group-item">{{ value }}: <strong>{{ subm_variant[key]
|
173
|
+
<li class="list-group-item">{{ value }}: <strong>{{ subm_variant[key]}}</strong></li>
|
174
174
|
{% endif %}
|
175
175
|
{% endfor %}
|
176
176
|
</ul>
|
@@ -214,7 +214,7 @@
|
|
214
214
|
</form>
|
215
215
|
<td><button id="{{case._id}}" type="button" class="btn btn-primary btn-xs cd_btn"><span class="fa fa-search-plus" aria-hidden="true"></span></button></td>
|
216
216
|
<td><a href="{{ url_for('cases.case', institute_id=institute._id, case_name=subm_obj.cases[case.case_id]) }}" target="_blank" rel="noopener">{{subm_obj.cases[case.case_id]}}</a></td>
|
217
|
-
<td>{{var_key_name[case.linking_id]|truncate(
|
217
|
+
<td>{{var_key_name[case.linking_id]|truncate(100,true,'..')}}</td>
|
218
218
|
<td>{{case.allele_origin}}</td>
|
219
219
|
<form id="delete_casedata_{{case._id}}" action="{{ url_for('clinvar.clinvar_delete_object', submission=subm_obj._id, object_type='case_data') }}" method="POST">
|
220
220
|
<td><button type="submit" name="delete_object" value="{{case._id}}" class="btn btn-danger btn-xs"><span class="fa fa-trash" aria-hidden="true"></span></button></td>
|
@@ -246,8 +246,8 @@
|
|
246
246
|
</div>
|
247
247
|
{% endmacro %}
|
248
248
|
|
249
|
-
{% macro status_modal() %}
|
250
|
-
<div class="modal fade" id="
|
249
|
+
{% macro status_modal(subm_id) %}
|
250
|
+
<div class="modal fade" id="statusModal_{{subm_id}}" tabindex="-1">
|
251
251
|
<div class="modal-dialog">
|
252
252
|
<div class="modal-content">
|
253
253
|
<div class="modal-header">
|
@@ -390,10 +390,10 @@ function validateConditions(){
|
|
390
390
|
return false;
|
391
391
|
}
|
392
392
|
|
393
|
-
// Make sure that provided conditions are numbers, except when condition type is MeSH
|
393
|
+
// Make sure that provided conditions are numbers, except when condition type is MeSH or MedGen
|
394
394
|
var selectedConditionsValues = $('#condition_tags').val();
|
395
395
|
for (let i = 0; i < selectedConditionsValues.length; i++) {
|
396
|
-
if (isNaN(selectedConditionsValues[i]) && $('#condition_type').val()
|
396
|
+
if (isNaN(selectedConditionsValues[i]) && !['Mesh', 'MedGen'].includes($('#condition_type').val())){
|
397
397
|
alert(`Condition ID "${selectedConditionsValues[i]}" has an invalid format.`);
|
398
398
|
return false;
|
399
399
|
}
|