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
@@ -1,7 +1,7 @@
|
|
1
1
|
{% import "bootstrap/wtf.html" as wtf %}
|
2
2
|
{% extends "layout.html" %}
|
3
3
|
{% from "overview/institute_sidebar.html" import institute_actionbar %}
|
4
|
-
{% from "overview/utils.html" import analysis_type %}
|
4
|
+
{% from "overview/utils.html" import analysis_type, cases_search_form %}
|
5
5
|
|
6
6
|
{% block title %}
|
7
7
|
{{ super() }} - {{ institute.display_name }} - Cases
|
@@ -20,137 +20,6 @@
|
|
20
20
|
</li>
|
21
21
|
{% endblock %}
|
22
22
|
|
23
|
-
|
24
|
-
{% macro search_form() %}
|
25
|
-
|
26
|
-
<!-- Collect advanced search key/values -->
|
27
|
-
{% set search = {} %}
|
28
|
-
{% for field in form._fields %}
|
29
|
-
{% if field not in ["search", "csrf_token", "advanced_search"] and form._fields[field].data %}
|
30
|
-
{% do search.update({field: form._fields[field].data}) %}
|
31
|
-
{% endif %}
|
32
|
-
{% endfor %}
|
33
|
-
|
34
|
-
<form action="{{ url_for('overview.cases', institute_id=institute._id) }}" method="POST" accept-charset="utf-8">
|
35
|
-
{{ form.hidden_tag() }}
|
36
|
-
|
37
|
-
<div class="row">
|
38
|
-
<div class="col-md-3 mb-3">
|
39
|
-
{{ form.case.label(class="form-label") }}
|
40
|
-
{{ form.case(class="form-control", placeholder="example:18201", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
41
|
-
</div>
|
42
|
-
<div class="col-md-1 mb-3">
|
43
|
-
{{ form.search_limit.label(class="form-label") }}
|
44
|
-
{{ form.search_limit(class="form-control") }}
|
45
|
-
</div>
|
46
|
-
<div class="d-grid btn-sm mb-3 col-md-2 mx-auto">
|
47
|
-
{{ form.search(class="btn btn-lg btn-primary mt-4") }}
|
48
|
-
</div>
|
49
|
-
<div class="d-grid btn-sm mb-3 col-md-2 mx-auto">
|
50
|
-
<a href="{{ url_for('overview.cases', institute_id=institute._id) }}" class="btn btn-lg btn-secondary mt-4 text-white" role="button">Reset search</a>
|
51
|
-
</div>
|
52
|
-
<div class="col-md-3 mb-3 form-check align-self-center mt-3 ms-3" data-bs-toggle="tooltip" title="Using multiple search criteria will narrow down your results as returned cases will contain all your searched conditions.">
|
53
|
-
{{ form.advanced_search(class="form-check-input") }}
|
54
|
-
{{ form.advanced_search.label(class="form-check-label") }}
|
55
|
-
</div>
|
56
|
-
</div>
|
57
|
-
<div class="row">
|
58
|
-
<div class="col-md-2 mb-3 form-check ms-3">
|
59
|
-
{{ form.skip_assigned(class="form-check-input") }}
|
60
|
-
{{ form.skip_assigned.label(class="form-check-label") }}
|
61
|
-
</div>
|
62
|
-
<div class="col-md-2 mb-3 form-check">
|
63
|
-
{{ form.is_research(class="form-check-input") }}
|
64
|
-
{{ form.is_research.label(class="form-check-label") }}
|
65
|
-
</div>
|
66
|
-
<div class="col-md-2 mb-3 form-check">
|
67
|
-
{{ form.clinvar_submitted(class="form-check-input") }}
|
68
|
-
{{ form.clinvar_submitted.label(class="form-check-label") }}
|
69
|
-
</div>
|
70
|
-
<div class="col-md-2 mb-3 form-check">
|
71
|
-
{{ form.has_rna(class="form-check-input") }}
|
72
|
-
{{ form.has_rna.label(class="form-check-label") }}
|
73
|
-
</div>
|
74
|
-
<div class="col-md-2 mb-3 form-check">
|
75
|
-
{{ form.validation_ordered(class="form-check-input") }}
|
76
|
-
{{ form.validation_ordered.label(class="form-check-label") }}
|
77
|
-
</div>
|
78
|
-
</div>
|
79
|
-
<!-- This div contains the advances search options -->
|
80
|
-
<div id="advancesSearchOptions">
|
81
|
-
<div class="row">
|
82
|
-
<div class="col-md-4 mb-3">
|
83
|
-
{{ form.exact_pheno.label(class="form-label") }}
|
84
|
-
{{ form.exact_pheno(class="form-control", placeholder="example:HP:0001298, HP:0001250,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
85
|
-
</div>
|
86
|
-
<div class="col-md-4 mb-3">
|
87
|
-
{{ form.exact_dia.label(class="form-label") }}
|
88
|
-
{{ form.exact_dia(class="form-control", placeholder="example:OMIM:125310, ORPHA:585,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
89
|
-
</div>
|
90
|
-
</div>
|
91
|
-
<div class="row">
|
92
|
-
<div class="col-md-4 mb-3">
|
93
|
-
{{ form.synopsis.label(class="form-label") }}
|
94
|
-
{{ form.synopsis(class="form-control", placeholder="example:epilepsy", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
95
|
-
</div>
|
96
|
-
<div class="col-md-4 mb-3">
|
97
|
-
{{ form.panel.label(class="form-label") }}
|
98
|
-
{{ form.panel(class="form-control", placeholder="example:NMD", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
99
|
-
</div>
|
100
|
-
<div class="col-md-4 mb-3">
|
101
|
-
{{ form.status.label(class="form-label") }}
|
102
|
-
{{ form.status(class="form-control", placeholder="example:active", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
103
|
-
</div>
|
104
|
-
</div>
|
105
|
-
<div class="row">
|
106
|
-
<div class="col-md-4 mb-3">
|
107
|
-
{{ form.tags.label(class="form-label") }}
|
108
|
-
{{ form.tags(class="form-control", placeholder="example:medical", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
109
|
-
</div>
|
110
|
-
<div class="col-md-4 mb-3">
|
111
|
-
{{ form.track.label(class="form-label") }}
|
112
|
-
{{ form.track(class="form-control", placeholder="rare or cancer", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
113
|
-
</div>
|
114
|
-
<div class="col-md-4 mb-3">
|
115
|
-
{{ form.pheno_group.label(class="form-label") }}
|
116
|
-
{{ form.pheno_group(class="form-control", placeholder="example:HP:0001166", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
117
|
-
</div>
|
118
|
-
</div>
|
119
|
-
<div class="row">
|
120
|
-
<div class="col-md-4 mb-3">
|
121
|
-
{{ form.cohort.label(class="form-label") }}
|
122
|
-
{{ form.cohort(class="form-control", placeholder="example:pedhep", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
123
|
-
</div>
|
124
|
-
<div class="col-md-4 mb-3">
|
125
|
-
{{ form.similar_case.label(class="form-label") }}
|
126
|
-
{{ form.similar_case(class="form-control", placeholder="example:18201", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
127
|
-
</div>
|
128
|
-
<div class="col-md-4 mb-3">
|
129
|
-
{{ form.similar_pheno.label(class="form-label") }}
|
130
|
-
{{ form.similar_pheno(class="form-control", placeholder="example:HP:0001298, HP:0001250,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
131
|
-
</div>
|
132
|
-
</div>
|
133
|
-
<div class="row">
|
134
|
-
<div class="col-md-4 mb-3">
|
135
|
-
{{ form.pinned.label(class="form-label") }}
|
136
|
-
{{ form.pinned(class="form-control", placeholder="example:POT1", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
137
|
-
</div>
|
138
|
-
<div class="col-md-4 mb-3">
|
139
|
-
{{ form.causative.label(class="form-label") }}
|
140
|
-
{{ form.causative(class="form-control", placeholder="example:POT1", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
141
|
-
</div>
|
142
|
-
<div class="col-md-4 mb-3">
|
143
|
-
{{ form.user.label(class="form-label") }}
|
144
|
-
{{ form.user(class="form-control", placeholder="John Doe", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
145
|
-
</div>
|
146
|
-
</div>
|
147
|
-
</div> <!--End of advancedSearchOptions div -->
|
148
|
-
</form>
|
149
|
-
<div>
|
150
|
-
<span class="text-muted">The following search criteria were used: {{search}}</span>
|
151
|
-
</div>
|
152
|
-
{% endmacro %}
|
153
|
-
|
154
23
|
{% macro cases_table(group_name, cases) %}
|
155
24
|
{% if sort_order == 'asc' %}
|
156
25
|
{% set sort_option = 'desc'%}
|
@@ -333,7 +202,7 @@
|
|
333
202
|
<div class="container-float">
|
334
203
|
<div class="card panel-default">
|
335
204
|
<div class="card-body">
|
336
|
-
{{
|
205
|
+
{{ cases_search_form(form, url_for('overview.cases', institute_id=institute._id), url_for('overview.cases', institute_id=institute._id), institute) }}
|
337
206
|
</div>
|
338
207
|
<div class="card-footer text-center">
|
339
208
|
Showing {{ found_cases }} / {{ nr_cases }} cases
|
@@ -1,5 +1,140 @@
|
|
1
1
|
{% from "variants/components.html" import variant_gene_symbols_cell, variant_funct_anno_cell, fusion_variant_gene_symbols_cell %}
|
2
2
|
|
3
|
+
{% macro cases_search_form(form, form_action, reset_action, institute = none) %}
|
4
|
+
<!-- Collect advanced search key/values -->
|
5
|
+
{% set search = {} %}
|
6
|
+
{% for field in form._fields %}
|
7
|
+
{% if field not in ["search", "csrf_token", "advanced_search"] and form._fields[field].data %}
|
8
|
+
{% do search.update({field: form._fields[field].data}) %}
|
9
|
+
{% endif %}
|
10
|
+
{% endfor %}
|
11
|
+
|
12
|
+
<form action="{{ form_action }}" method="POST" accept-charset="utf-8">
|
13
|
+
{{ form.hidden_tag() }}
|
14
|
+
|
15
|
+
<div class="row">
|
16
|
+
{% if not institute %} <!-- used only on dashboard page, when search might return results from many institutes -->
|
17
|
+
<div class="col-md-2 mb-3">
|
18
|
+
{{ form.search_institute.label(class="form-label") }}
|
19
|
+
{{ form.search_institute(class="form-control") }}
|
20
|
+
</div>
|
21
|
+
{% endif %}
|
22
|
+
<div class="col-md-3 mb-3">
|
23
|
+
{{ form.case.label(class="form-label") }}
|
24
|
+
{{ form.case(class="form-control", placeholder="example:18201", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
25
|
+
</div>
|
26
|
+
<div class="col-md-1 mb-3">
|
27
|
+
{{ form.search_limit.label(class="form-label") }}
|
28
|
+
{{ form.search_limit(class="form-control") }}
|
29
|
+
</div>
|
30
|
+
<div class="btn-sm mb-2 col-md-2 mx-auto">
|
31
|
+
{{ form.search(class="btn btn-lg btn-primary mt-4") }}
|
32
|
+
<a href="{{ reset_action }}" class="btn btn-lg btn-secondary mt-4 text-white">Reset search</a>
|
33
|
+
</div>
|
34
|
+
<div class="col-md-2 mb-3 form-check align-self-center mt-3 ms-3" data-bs-toggle="tooltip" title="Using multiple search criteria will narrow down your results as returned cases will contain all your searched conditions.">
|
35
|
+
{{ form.advanced_search(class="form-check-input") }}
|
36
|
+
{{ form.advanced_search.label(class="form-check-label") }}
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
{% if institute %} <!-- The following checkboxes will be displayed when the form is used on institute caseS page only, not on the dashboard -->
|
40
|
+
<div class="row">
|
41
|
+
<div class="col-md-2 mb-3 form-check ms-3">
|
42
|
+
{{ form.skip_assigned(class="form-check-input") }}
|
43
|
+
{{ form.skip_assigned.label(class="form-check-label") }}
|
44
|
+
</div>
|
45
|
+
<div class="col-md-2 mb-3 form-check">
|
46
|
+
{{ form.is_research(class="form-check-input") }}
|
47
|
+
{{ form.is_research.label(class="form-check-label") }}
|
48
|
+
</div>
|
49
|
+
<div class="col-md-2 mb-3 form-check">
|
50
|
+
{{ form.clinvar_submitted(class="form-check-input") }}
|
51
|
+
{{ form.clinvar_submitted.label(class="form-check-label") }}
|
52
|
+
</div>
|
53
|
+
<div class="col-md-2 mb-3 form-check">
|
54
|
+
{{ form.has_rna(class="form-check-input") }}
|
55
|
+
{{ form.has_rna.label(class="form-check-label") }}
|
56
|
+
</div>
|
57
|
+
<div class="col-md-2 mb-3 form-check">
|
58
|
+
{{ form.validation_ordered(class="form-check-input") }}
|
59
|
+
{{ form.validation_ordered.label(class="form-check-label") }}
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
{% endif %}
|
63
|
+
<!-- This div contains the advances search options -->
|
64
|
+
<div id="advancesSearchOptions">
|
65
|
+
<div class="row">
|
66
|
+
<div class="col-md-4 mb-3">
|
67
|
+
{{ form.exact_pheno.label(class="form-label") }}
|
68
|
+
{{ form.exact_pheno(class="form-control", placeholder="example:HP:0001298, HP:0001250,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
69
|
+
</div>
|
70
|
+
<div class="col-md-4 mb-3">
|
71
|
+
{{ form.exact_dia.label(class="form-label") }}
|
72
|
+
{{ form.exact_dia(class="form-control", placeholder="example:OMIM:125310, ORPHA:585,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
<div class="row">
|
76
|
+
<div class="col-md-4 mb-3">
|
77
|
+
{{ form.synopsis.label(class="form-label") }}
|
78
|
+
{{ form.synopsis(class="form-control", placeholder="example:epilepsy", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
79
|
+
</div>
|
80
|
+
<div class="col-md-4 mb-3">
|
81
|
+
{{ form.panel.label(class="form-label") }}
|
82
|
+
{{ form.panel(class="form-control", placeholder="example:NMD", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
83
|
+
</div>
|
84
|
+
<div class="col-md-4 mb-3">
|
85
|
+
{{ form.status.label(class="form-label") }}
|
86
|
+
{{ form.status(class="form-control", placeholder="example:active", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
<div class="row">
|
90
|
+
<div class="col-md-4 mb-3">
|
91
|
+
{{ form.tags.label(class="form-label") }}
|
92
|
+
{{ form.tags(class="form-control", placeholder="example:medical", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
93
|
+
</div>
|
94
|
+
<div class="col-md-4 mb-3">
|
95
|
+
{{ form.track.label(class="form-label") }}
|
96
|
+
{{ form.track(class="form-control", placeholder="rare or cancer", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
97
|
+
</div>
|
98
|
+
<div class="col-md-4 mb-3">
|
99
|
+
{{ form.pheno_group.label(class="form-label") }}
|
100
|
+
{{ form.pheno_group(class="form-control", placeholder="example:HP:0001166", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
101
|
+
</div>
|
102
|
+
</div>
|
103
|
+
<div class="row">
|
104
|
+
<div class="col-md-4 mb-3">
|
105
|
+
{{ form.cohort.label(class="form-label") }}
|
106
|
+
{{ form.cohort(class="form-control", placeholder="example:pedhep", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
107
|
+
</div>
|
108
|
+
<div class="col-md-4 mb-3">
|
109
|
+
{{ form.similar_case.label(class="form-label") }}
|
110
|
+
{{ form.similar_case(class="form-control", placeholder="example:18201", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
111
|
+
</div>
|
112
|
+
<div class="col-md-4 mb-3">
|
113
|
+
{{ form.similar_pheno.label(class="form-label") }}
|
114
|
+
{{ form.similar_pheno(class="form-control", placeholder="example:HP:0001298, HP:0001250,..", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
115
|
+
</div>
|
116
|
+
</div>
|
117
|
+
<div class="row">
|
118
|
+
<div class="col-md-4 mb-3">
|
119
|
+
{{ form.pinned.label(class="form-label") }}
|
120
|
+
{{ form.pinned(class="form-control", placeholder="example:POT1", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
121
|
+
</div>
|
122
|
+
<div class="col-md-4 mb-3">
|
123
|
+
{{ form.causative.label(class="form-label") }}
|
124
|
+
{{ form.causative(class="form-control", placeholder="example:POT1", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
125
|
+
</div>
|
126
|
+
<div class="col-md-4 mb-3">
|
127
|
+
{{ form.user.label(class="form-label") }}
|
128
|
+
{{ form.user(class="form-control", placeholder="John Doe", pattern="[^\\\<\>\?\!\=\/]*", title="Characters \<>?!=/ are not allowed") }}
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
</div> <!--End of advancedSearchOptions div -->
|
132
|
+
</form>
|
133
|
+
<div>
|
134
|
+
<span class="text-muted">The following search criteria were used: {{search}}</span>
|
135
|
+
</div>
|
136
|
+
{% endmacro %}
|
137
|
+
|
3
138
|
{% macro analysis_type(analysis_types) %}
|
4
139
|
{% for analysis_type in analysis_types %}
|
5
140
|
{% if analysis_type == 'wgs' %}
|
@@ -5,6 +5,7 @@
|
|
5
5
|
{% from "variants/components.html" import external_scripts, external_stylesheets, gene_cell %}
|
6
6
|
{% from "variant/buttons.html" import splice_junctions_button %}
|
7
7
|
{% from "variants/utils.html" import filter_script_main, pagination_footer, pagination_hidden_div, stash_filter_buttons, update_stash_filter_button_status%}
|
8
|
+
{% from "variant/components.html" import variant_scripts %}
|
8
9
|
|
9
10
|
{% block title %}
|
10
11
|
{{ super() }} - {{ institute.display_name }} - {{ case.display_name }} - {{ form.variant_type.data|capitalize }} omics outlier variants
|
@@ -117,6 +118,9 @@
|
|
117
118
|
</td>
|
118
119
|
<td class="text-end">{{ variant.chromosome }}</td>
|
119
120
|
<td class="text-end"><span style="white-space: nowrap;">{{ variant.position|human_longint|safe }}</span>-<span style="white-space: nowrap;">{{ variant.end|human_longint|safe }}</span>
|
121
|
+
<button type="button" class="fa fa-copy btn-xs js-tooltip js-copy"
|
122
|
+
style="background-color: Transparent;outline:none; border: none;" data-bs-toggle="tooltip" data-bs-placement="bottom" data-copy="{{ variant.chromosome }}:{{ variant.position }}-{{ variant.end }}" title="Copy to clipboard">
|
123
|
+
</button>
|
120
124
|
{% if case.has_rna_tracks %}
|
121
125
|
{{ splice_junctions_button(institute._id, case, None, variant.omics_variant_id) }}
|
122
126
|
{% endif %}
|
@@ -142,6 +146,7 @@
|
|
142
146
|
{% block scripts %}
|
143
147
|
{{ super() }}
|
144
148
|
{{ external_scripts() }}
|
149
|
+
{{ variant_scripts() }}
|
145
150
|
<script src="{{ url_for('variants.static', filename='form_scripts.js') }}"></script>
|
146
151
|
{{ filter_script_main(cytobands) }}
|
147
152
|
<script type="text/javascript">
|
@@ -180,7 +180,11 @@
|
|
180
180
|
<td>{{ gene.disease_associated_transcripts|join(', ') }}</td>
|
181
181
|
<td>{{ 'Yes' if gene.reduced_penetrance }}</td>
|
182
182
|
<td>{{ 'Yes' if gene.mosaicism }}</td>
|
183
|
-
<td
|
183
|
+
<td class="d-flex justify-content-center">
|
184
|
+
{% if gene.database_entry_version and gene.database_entry_version|string == panel.version|string %}
|
185
|
+
<span class="badge bg-success rounded-pill" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="This gene has been introduced in the panel starting from version {{gene.database_entry_version}}.">new</span>
|
186
|
+
{% endif %}
|
187
|
+
</td>
|
184
188
|
<td>{{ gene.inheritance_models|join(', ') }}</td>
|
185
189
|
<td>{{ gene.custom_inheritance_models|join(', ') }}</td>
|
186
190
|
<td>{{ gene.comment }}</td>
|
@@ -69,7 +69,11 @@
|
|
69
69
|
<td>{{ gene.disease_associated_transcripts|join(', ') }}</td>
|
70
70
|
<td>{{ 'Reduced penetrance' if gene.reduced_penetrance }}</td>
|
71
71
|
<td>{{ 'Mosaicism' if gene.mosaicism }}</td>
|
72
|
-
<td>
|
72
|
+
<td>
|
73
|
+
{% if gene.database_entry_version and gene.database_entry_version|string == panel.version|string %}
|
74
|
+
<span class="badge bg-success rounded-pill">new</span>
|
75
|
+
{% endif %}
|
76
|
+
</td>
|
73
77
|
<td>{{ gene.inheritance_models|join(', ') }}</td>
|
74
78
|
<td>{{ gene.custom_inheritance_models|join(', ') }}</td>
|
75
79
|
<td>{{ gene.comment }}</td>
|
@@ -63,6 +63,7 @@ def tx_overview(variant_obj: dict):
|
|
63
63
|
variant_obj(dict)
|
64
64
|
"""
|
65
65
|
overview_txs = [] # transcripts to be shown in transcripts overview
|
66
|
+
ensembl_txid_mane_transcripts = {}
|
66
67
|
if variant_obj.get("genes") is None:
|
67
68
|
variant_obj["overview_transcripts"] = []
|
68
69
|
return
|
@@ -89,7 +90,6 @@ def tx_overview(variant_obj: dict):
|
|
89
90
|
ovw_tx["muted_refseq_ids"] = []
|
90
91
|
|
91
92
|
for refseq_id in tx.get("refseq_identifiers", []):
|
92
|
-
decorated_tx = None
|
93
93
|
if ovw_tx["mane"] and ovw_tx["mane"].startswith(refseq_id):
|
94
94
|
decorated_tx = ovw_tx["mane"]
|
95
95
|
elif ovw_tx["mane_plus"] and ovw_tx["mane_plus"].startswith(refseq_id):
|
@@ -121,12 +121,17 @@ def tx_overview(variant_obj: dict):
|
|
121
121
|
ovw_tx["cbioportal_link"] = tx.get("cbioportal_link")
|
122
122
|
ovw_tx["mycancergenome_link"] = tx.get("mycancergenome_link")
|
123
123
|
|
124
|
+
ensembl_txid_mane_transcripts[tx.get("transcript_id")] = {
|
125
|
+
"mane": ovw_tx["mane"],
|
126
|
+
"mane_plus": ovw_tx["mane_plus"],
|
127
|
+
}
|
124
128
|
overview_txs.append(ovw_tx)
|
125
129
|
|
126
130
|
# sort txs for the presence of "mane_select_transcript" and "mane_plus_clinical_transcript"
|
127
131
|
variant_obj["overview_transcripts"] = sorted(
|
128
132
|
overview_txs, key=lambda tx: (tx["mane"], tx["mane_plus"]), reverse=True
|
129
133
|
)
|
134
|
+
variant_obj["mane_transcripts"] = ensembl_txid_mane_transcripts
|
130
135
|
|
131
136
|
|
132
137
|
def get_igv_tracks(build: str = "37") -> set:
|
@@ -1,33 +1,34 @@
|
|
1
1
|
{% macro database_buttons(variant) %}
|
2
2
|
<div class="mt-3">
|
3
|
-
<a class="btn btn-sm btn-info text-white me-1 mb-1"
|
4
|
-
<a class="btn btn-sm btn-info text-white me-1 mb-1"
|
3
|
+
<a class="btn btn-sm btn-info text-white me-1 mb-1" href="{{ variant.swegen_link }}" rel="noreferrer noopener" target="_blank">SweGen</a>
|
4
|
+
<a class="btn btn-sm btn-info text-white me-1 mb-1" href="{{ variant.beacon_link }}" rel="noreferrer noopener" target="_blank">Beacon</a>
|
5
|
+
<a class="btn btn-sm btn-info text-white me-1 mb-1" href="{{ variant.franklin_link }}" rel="noreferrer noopener" target="_blank">Franklin</a>
|
5
6
|
{% if variant.cosmic_links %} <!-- This is a list of tuples : [(id1, link1), (id2, link2), ..] -->
|
6
7
|
{% for cosmic_link in variant.cosmic_links %}
|
7
|
-
<a data-bs-toggle="tooltip" title="COSMIC" class="btn btn-sm btn-info text-white me-1 mb-1"
|
8
|
+
<a data-bs-toggle="tooltip" title="COSMIC" class="btn btn-sm btn-info text-white me-1 mb-1" rel="noreferrer noopener" href="{{cosmic_link[1]}}" target="_blank">{{cosmic_link[0]}}</a>
|
8
9
|
{% endfor %}
|
9
10
|
{% endif %}
|
10
11
|
{% if variant.dbsnp_id %}
|
11
12
|
{% for snp in variant.dbsnp_id.split(';') %}
|
12
|
-
<a class="btn btn-sm btn-info text-white me-1 mb-1"
|
13
|
+
<a class="btn btn-sm btn-info text-white me-1 mb-1" target="_blank" rel="noreferrer noopener" href="{{variant.snp_links[snp]}}">dbSNP ({{ snp }})</a>
|
13
14
|
{% endfor %}
|
14
15
|
{% endif %}
|
15
16
|
</div>
|
16
17
|
<div class="btn-group">
|
17
18
|
{% if primary_transcript and primary_transcript.varsome_link %}
|
18
|
-
<a href="{{ primary_transcript.varsome_link }}" class="btn btn-sm btn-info text-white me-1 mb-1"
|
19
|
+
<a href="{{ primary_transcript.varsome_link }}" class="btn btn-sm btn-info text-white me-1 mb-1" rel="noreferrer noopener" target="_blank"
|
19
20
|
data-bs-toggle="tooltip" title="Varsome">V</a>
|
20
21
|
{% endif %}
|
21
22
|
{% if primary_transcript and primary_transcript.tp53_link %}
|
22
|
-
<a href="{{ primary_transcript.tp53_link }}" class="btn btn-sm btn-info text-white me-1 mb-1"
|
23
|
+
<a href="{{ primary_transcript.tp53_link }}" class="btn btn-sm btn-info text-white me-1 mb-1" rel="noreferrer noopener" target="_blank"
|
23
24
|
data-bs-toggle="tooltip" title="MutanTP53">TP53</a>
|
24
25
|
{% endif %}
|
25
26
|
{% if primary_transcript and primary_transcript.cbioportal_link %}
|
26
|
-
<a href="{{ primary_transcript.cbioportal_link }}" class="btn btn-sm btn-info text-white me-1 mb-1"
|
27
|
+
<a href="{{ primary_transcript.cbioportal_link }}" class="btn btn-sm btn-info text-white me-1 mb-1" rel="noreferrer noopener" target="_blank"
|
27
28
|
data-bs-toggle="tooltip" title="cBioPortal">CBP</a>
|
28
29
|
{% endif %}
|
29
30
|
{% if primary_transcript and primary_transcript.mycancergenome_link %}
|
30
|
-
<a href="{{ primary_transcript.mycancergenome_link }}" class="btn btn-sm btn-info text-white me-1 mb-1"
|
31
|
+
<a href="{{ primary_transcript.mycancergenome_link }}" class="btn btn-sm btn-info text-white me-1 mb-1" rel="noreferrer noopener" target="_blank"
|
31
32
|
data-bs-toggle="tooltip" title="MyCancerGenome">MCG</a>
|
32
33
|
{% endif %}
|
33
34
|
</div>
|
@@ -36,10 +37,10 @@
|
|
36
37
|
{% macro splice_junctions_button(institute_id, case, variant_id, omics_variant_id) %}
|
37
38
|
{% if omics_variant_id %}
|
38
39
|
<a class="btn btn-sm btn-secondary text-white" href="{{url_for('alignviewers.sashimi_igv', institute_id=institute_id, case_name=case.display_name, omics_variant_id=omics_variant_id)}}" target="_blank"
|
39
|
-
data-bs-toggle="tooltip" data-bs-placement="top" title="Only available in build GRCh{{ case.rna_genome_build or '38' }}">RNA
|
40
|
+
data-bs-toggle="tooltip" data-bs-placement="top" title="Only available in build GRCh{{ case.rna_genome_build or '38' }}"><span class="fa fa-magnifying-glass fa-fw me-1"></span>IGV RNA</a>
|
40
41
|
{% else %}
|
41
42
|
<a class="btn btn-sm btn-secondary text-white" href="{{url_for('alignviewers.sashimi_igv', institute_id=institute_id, case_name=case.display_name, variant_id=variant_id)}}" target="_blank"
|
42
|
-
data-bs-toggle="tooltip" data-bs-placement="top" title="Only available in build GRCh{{ case.rna_genome_build or '38' }}">RNA
|
43
|
+
data-bs-toggle="tooltip" data-bs-placement="top" title="Only available in build GRCh{{ case.rna_genome_build or '38' }}"><span class="fa fa-magnifying-glass fa-fw me-1"></span>IGV RNA</a>
|
43
44
|
{% endif %}
|
44
45
|
{% endmacro %}
|
45
46
|
|
@@ -66,51 +66,70 @@
|
|
66
66
|
{% endmacro %}
|
67
67
|
|
68
68
|
{% macro alignments(institute, case, variant, current_user, config, igv_tracks, has_rna_tracks=False) %}
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
{
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
{
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
69
|
+
<ul class="list-group">
|
70
|
+
<li class="list-group-item d-flex justify-content-between">
|
71
|
+
{% if variant.is_mitochondrial and not case.mt_bams %}
|
72
|
+
<span data-bs-toggle="tooltip" title="Alignment file(s) missing">
|
73
|
+
<a href="{{url_for('alignviewers.igv', institute_id=institute['_id'], case_name=case['display_name'], variant_id=variant['_id'])}}"
|
74
|
+
target="_blank"
|
75
|
+
class="btn btn-secondary btn-sm text-white disabled" aria-disabled="true"><span class="fa fa-times-circle fa-fw me-1"></span>IGV mtDNA
|
76
|
+
</a>
|
77
|
+
</span>
|
78
|
+
{% elif not case.bam_files and not variant.is_mitochondrial %}
|
79
|
+
<span data-bs-toggle="tooltip" title="Alignment file(s) missing">
|
80
|
+
<a href="{{url_for('alignviewers.igv', institute_id=institute['_id'], case_name=case['display_name'], variant_id=variant['_id'])}}"
|
81
|
+
target="_blank"
|
82
|
+
class="btn btn-secondary btn-sm text-white disabled"
|
83
|
+
aria-disabled="true"><span class="fa fa-times-circle fa-fw me-1"></span>IGV gDNA
|
84
|
+
</a>
|
85
|
+
</span>
|
86
|
+
{% else %}
|
87
|
+
<span>
|
88
|
+
<a href="{{url_for('alignviewers.igv', institute_id=institute['_id'], case_name=case['display_name'], variant_id=variant['_id'])}}"
|
89
|
+
target="_blank"
|
90
|
+
class="btn btn-secondary btn-sm text-white"><span class="fa fa-magnifying-glass fa-fw me-1"></span>
|
91
|
+
IGV {% if variant.is_mitochondrial %}mt{% else %}g{% endif %}DNA
|
92
|
+
</a>
|
93
|
+
</span>
|
94
|
+
{% endif %}
|
95
|
+
{% if variant.category == "str" %}
|
96
|
+
<div class="ms-1">
|
97
|
+
{{ reviewer_button(case,variant,case_groups,institute._id) }}
|
98
|
+
</div>
|
99
|
+
{% endif %}
|
100
|
+
{% if has_rna_tracks %}
|
101
|
+
<div class="ms-1">
|
102
|
+
{{ splice_junctions_button(institute._id, case, variant._id) }}
|
103
|
+
</div>
|
104
|
+
{% endif %}
|
105
|
+
{% if variant.alamut_link %}
|
106
|
+
<div class="ms-1">
|
107
|
+
<a href="{{ variant.alamut_link }}" class="btn btn-sm btn-secondary" target="_blank" data-bs-toggle="tooltip" title="Alamut Visual (Plus) - Open variant - with genome g. coordinate">Alamut g.</a>
|
108
|
+
</div>
|
109
|
+
{% endif %}
|
110
|
+
{% for gene in variant.genes %}
|
111
|
+
<div class="d-flex flex-wrap ms-1">
|
112
|
+
{% if gene.alamut_link %}
|
113
|
+
<a href="{{ gene.alamut_link }}" class="btn btn-sm btn-secondary text-white" rel="noopener" referrerpolicy="no-referrer" target="_blank" data-bs-toggle="tooltip" title="Alamut Visual (Plus) - Open variant - with gene transcript c. coordinate">Alamut {{ gene.common.hgnc_symbol if gene.common else gene.hgnc_id }} c.</a>
|
114
|
+
{% endif %}
|
115
|
+
</div>
|
116
|
+
{% endfor %}
|
117
|
+
{% if config.chanjo_report %}
|
118
|
+
<div class="d-flex flex-wrap ms-1">
|
91
119
|
{% for gene in variant.genes %}
|
92
|
-
<
|
93
|
-
|
94
|
-
|
95
|
-
{% endif %}
|
96
|
-
</div>
|
120
|
+
<a class="btn btn-sm btn-secondary text-white" rel="noopener noreferrer" target="_blank" href="{{ url_for('report.gene', gene_id=gene.hgnc_id, sample_id=variant.samples|map(attribute='sample_id')|list) }}">
|
121
|
+
Gene coverage: {{ gene.common.hgnc_symbol if gene.common else gene.hgnc_id }}
|
122
|
+
</a>
|
97
123
|
{% endfor %}
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
</li>
|
108
|
-
<li class="list-group-item">
|
109
|
-
<div>
|
110
|
-
{{ igv_track_selection(igv_tracks, current_user) }}
|
111
|
-
</div>
|
112
|
-
</li>
|
113
|
-
</ul>
|
124
|
+
</div>
|
125
|
+
{% endif %}
|
126
|
+
</li>
|
127
|
+
<li class="list-group-item">
|
128
|
+
<div>
|
129
|
+
{{ igv_track_selection(igv_tracks, current_user) }}
|
130
|
+
</div>
|
131
|
+
</li>
|
132
|
+
</ul>
|
114
133
|
{% endmacro %}
|
115
134
|
|
116
135
|
{% macro acmg_form(institute, case, variant, ACMG_OPTIONS, selected=None) %}
|
@@ -224,7 +243,7 @@
|
|
224
243
|
<div class="card-body mt-1 ms-3 mb-1" style="padding: 0;">
|
225
244
|
Matching tiered:
|
226
245
|
{% for tier, tiered_info in matching_tiered.items() %}
|
227
|
-
<a style="padding: 0;" class="btn btn-{{tiered_info.label}} btn-xs" data-bs-toggle="collapse" href="#collapse_{{tier}}"
|
246
|
+
<a style="padding: 0;" class="btn btn-{{tiered_info.label}} btn-xs" data-bs-toggle="collapse" href="#collapse_{{tier}}" aria-expanded="false" aria-controls="collapseExample">
|
228
247
|
{{tier}} ({{tiered_info.links|length}}x)
|
229
248
|
</a>
|
230
249
|
<div class="collapse" id="collapse_{{tier}}">
|
@@ -2,7 +2,7 @@
|
|
2
2
|
{% from "utils.html" import comments_table, pedigree_panel %}
|
3
3
|
{% from "variants/components.html" import frequency_cell_general %}
|
4
4
|
{% from "variants/utils.html" import cell_rank, dismiss_variants_block, filter_form_footer, update_stash_filter_button_status, pagination_footer, pagination_hidden_div, str_filters %}
|
5
|
-
{% from "variant/buttons.html" import
|
5
|
+
{% from "variant/buttons.html" import reviewer_button%}
|
6
6
|
|
7
7
|
{% block title %}
|
8
8
|
{{ super() }} - {{ institute.display_name }} - {{ case.display_name }} - STR variants
|