Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.

Commit b2ab961

Browse files
afrubinEstelleDa
andauthored
update to v2.0.3 (#168)
* Update SRA identifier field name (#152) * don't accept ArrayExpress arrays as raw reads * prefer DOIs over DOI identifer or DOI accession in text * prefer PubMed IDs over PubMed identifiers in text * prefer Raw reads accessions over SRA identifiers in text * migrations for verbose name changes * fix raw reads label in html * fix count column ordering bug (#164) * fix score column ordering bug (#167) * fix target sequence accession auto-fill (#166) * fix public score set metadata editing (#165) * update version * tag the correct postgres image Co-authored-by: EstelleDa <[email protected]>
1 parent 8b11b90 commit b2ab961

File tree

16 files changed

+207
-55
lines changed

16 files changed

+207
-55
lines changed

core/static/core/mavedb/scoreset-form.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,14 +269,14 @@ function initializeScoresetForm ({ newForm = true, privateDateset = true }) {
269269
}
270270

271271
let id = this.value;
272-
let uniprotSelect = $('#id_uniprot-identifier');
273-
let uniprotOffsetElem = $('#id_uniprot-offset');
272+
let uniprotSelect = $('#id_uniprot-offset-identifier');
273+
let uniprotOffsetElem = $('#id_uniprot-offset-offset');
274274

275-
let refseqSelect = $('#id_refseq-identifier');
276-
let refseqOffsetElem = $('#id_refseq-offset');
275+
let refseqSelect = $('#id_refseq-offset-identifier');
276+
let refseqOffsetElem = $('#id_refseq-offset-offset');
277277

278-
let ensemblSelect = $('#id_ensembl-identifier');
279-
let ensemblOffsetElem = $('#id_ensembl-offset');
278+
let ensemblSelect = $('#id_ensembl-offset-identifier');
279+
let ensemblOffsetElem = $('#id_ensembl-offset-offset');
280280

281281
let nameElem = document.getElementById('id_name');
282282
let categoryElem = document.getElementById('id_category');
@@ -322,7 +322,6 @@ function initializeScoresetForm ({ newForm = true, privateDateset = true }) {
322322
$(uniprotSelect).val('').trigger('change');
323323
$(uniprotOffsetElem).val(0);
324324
}
325-
326325
// Change RefSeq
327326
if (refseq_id) {
328327
$(refseqSelect).val(refseq_id).trigger('change');

data/main/site_info.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"md_privacy": "",
77
"md_terms": "",
88
"md_usage_guide": "",
9-
"version": "2.0.2"
9+
"version": "2.0.3"
1010
}

dataset/forms/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def __init__(self, *args, **kwargs):
8686
self.fields["sra_ids"] = FlexibleModelMultipleChoiceField(
8787
klass=SraIdentifier,
8888
to_field_name="identifier",
89-
label="SRA identifiers",
89+
label="Raw reads accessions",
9090
required=False,
9191
queryset=SraIdentifier.objects.all(),
9292
widget=forms.SelectMultiple(
@@ -96,7 +96,7 @@ def __init__(self, *args, **kwargs):
9696
self.fields["doi_ids"] = FlexibleModelMultipleChoiceField(
9797
klass=DoiIdentifier,
9898
to_field_name="identifier",
99-
label="DOI identifiers",
99+
label="DOIs",
100100
required=False,
101101
queryset=DoiIdentifier.objects.all(),
102102
widget=forms.SelectMultiple(
@@ -106,7 +106,7 @@ def __init__(self, *args, **kwargs):
106106
self.fields["pubmed_ids"] = FlexibleModelMultipleChoiceField(
107107
klass=PubmedIdentifier,
108108
to_field_name="identifier",
109-
label="PubMed identifiers",
109+
label="PubMed IDs",
110110
required=False,
111111
queryset=PubmedIdentifier.objects.all(),
112112
widget=forms.SelectMultiple(
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.29 on 2021-08-25 06:34
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("dataset", "0016_auto_20200923_1616"),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name="experiment",
17+
name="doi_ids",
18+
field=models.ManyToManyField(
19+
blank=True,
20+
related_name="associated_experiments",
21+
to="metadata.DoiIdentifier",
22+
verbose_name="DOIs",
23+
),
24+
),
25+
migrations.AlterField(
26+
model_name="experiment",
27+
name="pubmed_ids",
28+
field=models.ManyToManyField(
29+
blank=True,
30+
related_name="associated_experiments",
31+
to="metadata.PubmedIdentifier",
32+
verbose_name="PubMed IDs",
33+
),
34+
),
35+
migrations.AlterField(
36+
model_name="experiment",
37+
name="sra_ids",
38+
field=models.ManyToManyField(
39+
blank=True,
40+
related_name="associated_experiments",
41+
to="metadata.SraIdentifier",
42+
verbose_name="Raw reads accessions",
43+
),
44+
),
45+
migrations.AlterField(
46+
model_name="experimentset",
47+
name="doi_ids",
48+
field=models.ManyToManyField(
49+
blank=True,
50+
related_name="associated_experimentsets",
51+
to="metadata.DoiIdentifier",
52+
verbose_name="DOIs",
53+
),
54+
),
55+
migrations.AlterField(
56+
model_name="experimentset",
57+
name="pubmed_ids",
58+
field=models.ManyToManyField(
59+
blank=True,
60+
related_name="associated_experimentsets",
61+
to="metadata.PubmedIdentifier",
62+
verbose_name="PubMed IDs",
63+
),
64+
),
65+
migrations.AlterField(
66+
model_name="experimentset",
67+
name="sra_ids",
68+
field=models.ManyToManyField(
69+
blank=True,
70+
related_name="associated_experimentsets",
71+
to="metadata.SraIdentifier",
72+
verbose_name="Raw reads accessions",
73+
),
74+
),
75+
migrations.AlterField(
76+
model_name="scoreset",
77+
name="doi_ids",
78+
field=models.ManyToManyField(
79+
blank=True,
80+
related_name="associated_scoresets",
81+
to="metadata.DoiIdentifier",
82+
verbose_name="DOIs",
83+
),
84+
),
85+
migrations.AlterField(
86+
model_name="scoreset",
87+
name="pubmed_ids",
88+
field=models.ManyToManyField(
89+
blank=True,
90+
related_name="associated_scoresets",
91+
to="metadata.PubmedIdentifier",
92+
verbose_name="PubMed IDs",
93+
),
94+
),
95+
migrations.AlterField(
96+
model_name="scoreset",
97+
name="sra_ids",
98+
field=models.ManyToManyField(
99+
blank=True,
100+
related_name="associated_scoresets",
101+
to="metadata.SraIdentifier",
102+
verbose_name="Raw reads accessions",
103+
),
104+
),
105+
]

dataset/models/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,19 +208,19 @@ def tracked_fields(cls):
208208
sra_ids = models.ManyToManyField(
209209
SraIdentifier,
210210
blank=True,
211-
verbose_name="SRA identifiers",
211+
verbose_name="Raw reads accessions",
212212
related_name="associated_%(class)ss",
213213
)
214214
doi_ids = models.ManyToManyField(
215215
DoiIdentifier,
216216
blank=True,
217-
verbose_name="DOI identifiers",
217+
verbose_name="DOIs",
218218
related_name="associated_%(class)ss",
219219
)
220220
pubmed_ids = models.ManyToManyField(
221221
PubmedIdentifier,
222222
blank=True,
223-
verbose_name="PubMed identifiers",
223+
verbose_name="PubMed IDs",
224224
related_name="associated_%(class)ss",
225225
)
226226

dataset/templates/dataset/base/base.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ <h2 id="metadata" class="underline left-align section-heading">
413413

414414
{% if is_experiment %}
415415
{% if instance.sra_ids.count %}
416-
<strong>SRA:</strong>
416+
<strong>Raw reads:</strong>
417417
<ul>
418418
{% for sra in instance.sra_ids.all %}
419419
<li>
@@ -423,7 +423,7 @@ <h2 id="metadata" class="underline left-align section-heading">
423423
{% endfor %}
424424
</ul>
425425
{% else %}
426-
<p><strong>SRA:</strong> No associated SRAs </p>
426+
<p><strong>Raw reads:</strong> No associated raw reads </p>
427427
{% endif %}
428428
{% endif %}
429429
{% endif %}

dataset/views/scoreset.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def get_context_data(self, **kwargs):
6363
order_by = "id" # instance.primary_hgvs_column
6464
variants = instance.children.order_by("{}".format(order_by))[:10]
6565
context["variants"] = variants
66+
# instance get the count_column from dataset, while instance.children get the count_column from variant.
6667
context["score_columns"] = instance.score_columns
6768
context["count_columns"] = instance.count_columns
6869

@@ -107,9 +108,26 @@ def get_ajax(self, *args, **kwargs):
107108
for variant in variants:
108109
row = {}
109110
if type_ == "counts":
110-
v_data = variant.count_data
111+
# Reorder the columns cause variants have different order from score set.
112+
variant_dict = variant.data["count_data"]
113+
correct_order = instance.count_columns[3:]
114+
ordered_dict_items = [
115+
(k, variant_dict[k]) for k in correct_order
116+
]
117+
v_data = variant.count_data[:3]
118+
for o in ordered_dict_items:
119+
v_data.append(o[1])
120+
# v_data = variant.count_data
111121
else:
112-
v_data = variant.score_data
122+
# Reorder the columns because variants have different order from score set table.
123+
variant_dict = variant.data["score_data"]
124+
correct_order = instance.score_columns[3:]
125+
ordered_dict_items = [
126+
(k, variant_dict[k]) for k in correct_order
127+
]
128+
v_data = variant.score_data[:3]
129+
for o in ordered_dict_items:
130+
v_data.append(o[1])
113131

114132
for i, data in enumerate(v_data):
115133
if isinstance(data, float):
@@ -167,7 +185,6 @@ def form_valid(self, form: Dict[str, Any]) -> HttpResponseRedirect:
167185
profile = self.request.user.profile
168186
profile.clear_submission_errors()
169187
profile.save()
170-
171188
self.save_forms(form)
172189
messages.success(self.request, self.get_success_message())
173190
except Exception as error:
@@ -220,7 +237,6 @@ def get_success_message(self) -> str:
220237
@transaction.atomic()
221238
def save_forms(self, forms: Dict[str, Any]) -> Dict[str, Any]:
222239
scoreset_form: ScoreSetForm = forms["scoreset_form"]
223-
224240
with create_revision():
225241
scoreset: ScoreSet = scoreset_form.save(commit=True)
226242
self.object: ScoreSet = scoreset
@@ -357,6 +373,7 @@ def dispatch(self, request, *args, **kwargs) -> HttpResponseRedirect:
357373

358374
return super().dispatch(request, *args, **kwargs)
359375

376+
# Create a new scoreset will call this method
360377
def post(self, request, *args, **kwargs):
361378
"""
362379
Handles POST requests, instantiating a form instance with the passed
@@ -373,7 +390,6 @@ def post(self, request, *args, **kwargs):
373390

374391
scoreset_form: ScoreSetForm = forms.pop("scoreset_form")
375392
valid &= scoreset_form.is_valid(targetseq=target_form.get_targetseq())
376-
377393
# Check that if AA sequence, dataset defined pro variants only.
378394
if (
379395
target_form.sequence_is_protein
@@ -392,7 +408,6 @@ def post(self, request, *args, **kwargs):
392408
# Put forms back into forms dictionary.
393409
forms["scoreset_form"] = scoreset_form
394410
forms["target_gene_form"] = target_form
395-
396411
if valid:
397412
return self.form_valid(forms)
398413
else:
@@ -423,6 +438,7 @@ def get_context_data(self, **kwargs):
423438
return context
424439

425440
@transaction.atomic()
441+
# Saving a new scoreset calls this method.
426442
def save_forms(self, forms: Dict[str, Any]) -> Dict[str, Any]:
427443
"""Called by form_valid when all forms are ready to be saved."""
428444
forms = super().save_forms(forms=forms)
@@ -516,16 +532,12 @@ def post(self, request, *args, **kwargs):
516532
"""
517533
# Store reference to object that will be created later
518534
self.object: ScoreSet = self.get_object()
519-
520535
forms = self.get_form()
521536
valid = True
522-
523537
if self.object.private:
524538
target_form: TargetGeneForm = forms.pop("target_gene_form")
525539
scoreset_form: ScoreSetForm = forms.pop("scoreset_form")
526-
527540
valid &= target_form.is_valid()
528-
529541
if not self.object.get_target().match_sequence(
530542
sequence=target_form.get_targetseq()
531543
):
@@ -541,7 +553,6 @@ def post(self, request, *args, **kwargs):
541553
valid &= scoreset_form.is_valid(
542554
targetseq=target_form.get_targetseq()
543555
)
544-
545556
# Check that if AA sequence, dataset defined pro variants only,
546557
# but only if new files have been uploaded.
547558
if (
@@ -558,20 +569,22 @@ def post(self, request, *args, **kwargs):
558569

559570
# Check remaining forms which do not need special treatment
560571
valid &= all(form.is_valid() for _, form in forms.items())
561-
562572
# Put forms back into forms dictionary just in case
563573
forms["scoreset_form"] = scoreset_form
564574
forms["target_gene_form"] = target_form
565575
else:
566576
scoreset_form: ScoreSetForm = forms.pop("scoreset_form")
567577
valid &= scoreset_form.is_valid()
578+
# Without this one, the forms will be empty so that users can't edit public score set.
579+
forms["scoreset_form"] = scoreset_form
568580

569581
if valid:
570582
return self.form_valid(forms)
571583
else:
572584
return self.form_invalid(forms)
573585

574586
@transaction.atomic()
587+
# Save editing result calls this method. ss_form links to scoreset count_data.
575588
def save_forms(self, forms: Dict[str, Any]) -> Dict[str, Any]:
576589
"""Called by form_valid when all forms are ready to be saved."""
577590
forms = super().save_forms(forms=forms)

docker-compose-dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ services:
2121
- DJANGO_SETTINGS_MODULE=settings.development
2222

2323
database:
24-
image: mavedb/postgres:dev
24+
image: postgres:9.6
2525
build:
2626
context: docker/postgres
2727
volumes:

docker-compose-prod.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ services:
1616
- DJANGO_SETTINGS_MODULE=settings.production
1717

1818
database:
19-
image: mavedb/postgres:prod
19+
image: postgres:9.6
2020
build:
2121
context: docker/postgres
2222
restart: unless-stopped

main/management/commands/addpmid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class Command(BaseCommand):
1010
def add_arguments(self, parser):
1111
parser.add_argument("--urn", type=str, help="Dataset URN")
12-
parser.add_argument("--pmid", type=str, help="PubMed identifier")
12+
parser.add_argument("--pmid", type=str, help="PubMed ID")
1313

1414
def handle(self, *args, **kwargs):
1515
urn = kwargs.get("urn", None)

0 commit comments

Comments
 (0)