Skip to content

Commit 006b296

Browse files
authored
Merge pull request #1486 from ImagingDataCommons/release-48-sp
#1409
2 parents 9be804e + 4d60e12 commit 006b296

File tree

7 files changed

+64
-73
lines changed

7 files changed

+64
-73
lines changed

idc/demo_views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def cohort_detail(request, cohort_id):
5454
if debug: logger.debug('Called {}'.format(sys._getframe().f_code.co_name))
5555

5656
try:
57-
req = request.GET if request.GET else request.POST
57+
req = request.GET if request.method == 'GET' else request.POST
5858
is_dicofdic = (req.get('is_dicofdic', "False").lower() == "true")
5959
source = req.get('data_source_type', DataSource.SOLR)
6060
fields = json.loads(req.get('fields', '[]'))

idc/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@
6060
re_path(r'^cart/$', views.cart_page, name='cart'),
6161
re_path(r'^explore/cart/$', views.cart_page, name='get_explore_cart'),
6262
re_path(r'^cart_data/$', views.cart_data, name='get_cart_data'),
63-
re_path(r'^cart_data_stats/$', views.cart_data_stats, name='get_cart_data_stats'),
6463
re_path(r'^series_ids/(?P<patient_id>[A-Za-z0-9\.\-_]+)/$', views.get_series, name='get_series_by_case'),
6564
re_path(r'^series_ids/(?P<patient_id>[A-Za-z0-9\.\-_]+)/(?P<study_uid>[0-9\.]+)/$', views.get_series, name='get_series'),
6665
re_path(r'^collaborators/$', views.collaborators, name='collaborators'),
6766
re_path(r'^collections/', include('idc_collections.urls')),
67+
re_path(r'^citations/', views.get_citations, name='get_citations'),
6868
# re_path(r'^share/', include('sharing.urls')),
6969
]
7070

idc/views.py

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@
3232
from django.urls import reverse
3333
from django.contrib import messages
3434
from django.utils.html import escape
35+
from django.utils.encoding import uri_to_iri
3536

3637
from google_helpers.stackdriver import StackDriverLogger
3738
from cohorts.models import Cohort, Cohort_Perms
3839

39-
from idc_collections.models import Program, DataSource, Collection, ImagingDataCommonsVersion, Attribute, Attribute_Tooltips, DataSetType
40+
from idc_collections.models import Program, DataSource, Collection, ImagingDataCommonsVersion, Attribute, Attribute_Tooltips, DataSetType, Citation
4041
from idc_collections.collex_metadata_utils import build_explorer_context, get_collex_metadata, create_file_manifest, get_cart_data_serieslvl, get_cart_data_studylvl, get_table_data_with_cart_data
4142
from allauth.socialaccount.models import SocialAccount
4243
from django.core.exceptions import ObjectDoesNotExist
@@ -366,6 +367,27 @@ def populate_tables(request):
366367
return JsonResponse(response, status=status)
367368

368369

370+
def get_citations(request):
371+
resp = { 'message': 'error', 'citations': None}
372+
try:
373+
req = request.GET if request.method == 'GET' else request.POST
374+
if request.method == 'GET':
375+
dois = [uri_to_iri(x) for x in req.getlist("doi", [])]
376+
else:
377+
body_unicode = request.body.decode('utf-8')
378+
body = json.loads(body_unicode)
379+
dois = body.get("doi", [])
380+
cites = Citation.objects.filter(doi__in=dois)
381+
resp['citations'] = {x.doi: x.cite for x in cites}
382+
code = 200
383+
except Exception as e:
384+
logger.error("[ERROR] While fetching citations: ")
385+
logger.exception(e)
386+
resp['message'] = "There was an error while attempting to fetch these citations."
387+
code = 500
388+
return JsonResponse(resp, status=code)
389+
390+
369391
# Data exploration and cohort creation page
370392
def explore_data_page(request, filter_path=False, path_filters=None):
371393
context = {'request': request}
@@ -377,8 +399,7 @@ def explore_data_page(request, filter_path=False, path_filters=None):
377399
request.session.create()
378400

379401
try:
380-
req = request.GET or request.POST
381-
402+
req = request.GET if request.method == 'GET' else request.POST
382403
is_dicofdic = (req.get('is_dicofdic', "False").lower() == "true")
383404
source = req.get('data_source_type', DataSource.SOLR)
384405
versions = json.loads(req.get('versions', '[]'))
@@ -428,6 +449,7 @@ def explore_data_page(request, filter_path=False, path_filters=None):
428449
collapse_on, is_json, uniques=uniques, totals=totals, with_stats=with_stats, disk_size=disk_size
429450
)
430451

452+
print(context.keys())
431453
if not('totals' in context):
432454
context['totals']={}
433455
if not('PatientID' in context['totals']):
@@ -614,39 +636,10 @@ def cart_page(request):
614636
return render(request, 'collections/cart_list.html', context)
615637

616638

617-
def cart_data_stats(request):
618-
status = 200
619-
response = {}
620-
field_list = ['collection_id', 'PatientID', 'StudyInstanceUID', 'SeriesInstanceUID', 'aws_bucket']
621-
try:
622-
623-
req = request.GET if request.GET else request.POST
624-
current_filters = json.loads(req.get('filters', '{}'))
625-
filtergrp_list = json.loads(req.get('filtergrp_list', '{}'))
626-
aggregate_level = req.get('aggregate_level', 'StudyInstanceUID')
627-
results_level = req.get('results_level', 'StudyInstanceUID')
628-
629-
partitions = json.loads(req.get('partitions', '{}'))
630-
631-
limit = int(req.get('limit', 1000))
632-
offset = int(req.get('offset', 0))
633-
length = int(req.get('length', 100))
634-
mxseries = int(req.get('mxseries',1000))
635-
636-
response = get_cart_and_filterset_stats(current_filters,filtergrp_list, partitions, limit, offset, length, mxseries, results_lvl=results_level)
637-
638-
except Exception as e:
639-
logger.error("[ERROR] While loading cart:")
640-
logger.exception(e)
641-
status = 400
642-
643-
return JsonResponse(response, status=status)
644-
645-
646639
def cart_data(request):
647640
status = 200
648641
response = {}
649-
field_list = ['collection_id', 'PatientID', 'StudyInstanceUID', 'SeriesInstanceUID', 'aws_bucket']
642+
field_list = ['collection_id', 'PatientID', 'StudyInstanceUID', 'SeriesInstanceUID', 'aws_bucket', "source_DOI"]
650643
try:
651644
req = request.GET if request.GET else request.POST
652645
filtergrp_list = json.loads(req.get('filtergrp_list', '{}'))

static/js/citations_modal.js

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ require([
6666

6767
A11y.Core();
6868

69-
var downloadToken = new Date().getTime();
69+
let csrftoken = $.getCookie('csrftoken')
7070

7171
$('#citations-modal').on('show.bs.modal', async function(event) {
7272
let button = $(event.relatedTarget);
@@ -76,36 +76,40 @@ require([
7676
cites_list.html(`
7777
Formatting citation(s)... <i class="fa fa-compass fa-spin"></i>
7878
`);
79-
let citations = [];
80-
await Promise.all(dois.map(async function(cite){
81-
if(!DOI_CACHE[cite]) {
82-
let response = await fetch(`https://doi.org/${cite}`, {
83-
headers: {
84-
"Accept": "text/x-bibliography; style=elsevier-vancouver-no-et-al"
85-
}
79+
let dois_to_get = dois.filter((d) => (DOI_CACHE[d] === null || DOI_CACHE[d] === undefined));
80+
if(dois_to_get.length > 0) {
81+
let resp = null;
82+
if(dois_to_get.join(",").length > 2048) {
83+
resp = await fetch(`${BASE_URL}/citations/`, {
84+
method: "POST",
85+
body: JSON.stringify({
86+
'doi': dois_to_get
87+
}),
88+
headers: {"X-CSRFToken": csrftoken},
89+
"content-type": "application/json"
8690
});
87-
if (!response.ok) {
88-
citations.push(`Encountered an error requesting DOI ${cite}`);
89-
} else {
90-
DOI_CACHE[cite] = await response.text();
91-
}
91+
} else {
92+
let encoded_dois = dois_to_get.map(d => `doi=${encodeURIComponent(d)}`);
93+
resp = await fetch(`${BASE_URL}/citations/?${encoded_dois.join("&")}`);
9294
}
93-
citations.push(DOI_CACHE[cite]);
94-
}));
95+
if(!resp.ok) {
96+
cites_list.html("Failed to retrieve citations!");
97+
throw new Error("Failed to retrieve citations!");
98+
}
99+
let new_cites = await resp.json();
100+
DOI_CACHE = {
101+
...new_cites['citations'],
102+
...DOI_CACHE
103+
};
104+
}
105+
let citations = dois.map(d => DOI_CACHE[d]);
95106
cites_list.html(citations.join("\n\n"));
96107
copy_cites.attr('content', citations.join("\n\n"));
97108
});
98109

99110
$('#citations-modal').on('hide.bs.modal', function() {
100-
101-
});
102-
103-
$('#export-manifest-modal').on('hidden.bs.modal', function() {
104111
$(".citations-list").empty();
105-
});
106-
107-
$('.copy-this').on('click', function(e) {
108-
// copy the entire set
112+
$("#citations-modal .copy-this").attr('content', "");
109113
});
110114

111115
tippy.delegate('#citations-modal', {

static/js/filterutils.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ define(['jquery', 'base'], function($, base) {
7373
}
7474
})
7575
$('.bq-string, .citations-list').html("");
76-
$('.bq-string-copy, .citations-button').attr('filter-params', "");
76+
$('.bq-string-copy').attr('filter-params', "");
77+
$('.citations-button').attr('data-dois', "");
7778
$('.hide-filter-uri').triggerHandler('click');
7879
$('.url-too-long').hide();
7980
$('#export-manifest-form').attr(
@@ -92,8 +93,7 @@ define(['jquery', 'base'], function($, base) {
9293
$(this).removeAttr("disabled");
9394
}
9495
}));
95-
$('.bq-string-display').attr('filter-params', JSON.stringify(filters));
96-
$('.bq-string-copy, .citations-button').attr('filter-params', JSON.stringify(filters));
96+
$('.bq-string-display, .bq-string-copy').attr('filter-params', JSON.stringify(filters));
9797
$('#export-manifest-form input[name="filters"]').val(JSON.stringify(filters));
9898
$('#export-manifest').removeAttr("data-no-filters");
9999
let url = BASE_URL+"/explore/filters/?";

static/js/image_search.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ require([
176176
$('input[name="async_download"]').val(
177177
async_download ? "True" : "False"
178178
);
179+
if('dois' in data) {
180+
$('.citations-button').attr("data-dois", Object.keys(data['dois']).join("||"));
181+
} else {
182+
$('.citations-button').attr("data-dois", "");
183+
}
179184
if (('filtered_counts' in data) && ('origin_set' in data['filtered_counts']) &&
180185
('access' in data['filtered_counts']['origin_set']['All']['attributes']) &&
181186
('Limited' in data['filtered_counts']['origin_set']['All']['attributes']['access']) &&

static/js/sapien/raw-svg.js

Lines changed: 1 addition & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)