Skip to content

Commit 6a8ffb0

Browse files
committed
-> #1409
1 parent 62aa790 commit 6a8ffb0

File tree

6 files changed

+46
-61
lines changed

6 files changed

+46
-61
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: 22 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,23 @@ def populate_tables(request):
366367
return JsonResponse(response, status=status)
367368

368369

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

379397
try:
380-
req = request.GET or request.POST
381-
398+
req = request.GET if request.method == 'GET' else request.POST
382399
is_dicofdic = (req.get('is_dicofdic', "False").lower() == "true")
383400
source = req.get('data_source_type', DataSource.SOLR)
384401
versions = json.loads(req.get('versions', '[]'))
@@ -428,6 +445,7 @@ def explore_data_page(request, filter_path=False, path_filters=None):
428445
collapse_on, is_json, uniques=uniques, totals=totals, with_stats=with_stats, disk_size=disk_size
429446
)
430447

448+
print(context.keys())
431449
if not('totals' in context):
432450
context['totals']={}
433451
if not('PatientID' in context['totals']):
@@ -614,39 +632,10 @@ def cart_page(request):
614632
return render(request, 'collections/cart_list.html', context)
615633

616634

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-
646635
def cart_data(request):
647636
status = 200
648637
response = {}
649-
field_list = ['collection_id', 'PatientID', 'StudyInstanceUID', 'SeriesInstanceUID', 'aws_bucket']
638+
field_list = ['collection_id', 'PatientID', 'StudyInstanceUID', 'SeriesInstanceUID', 'aws_bucket', "source_DOI"]
650639
try:
651640
req = request.GET if request.GET else request.POST
652641
filtergrp_list = json.loads(req.get('filtergrp_list', '{}'))

static/js/citations_modal.js

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -76,36 +76,27 @@ 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-
}
86-
});
87-
if (!response.ok) {
88-
citations.push(`Encountered an error requesting DOI ${cite}`);
89-
} else {
90-
DOI_CACHE[cite] = await response.text();
91-
}
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 encoded_dois = dois_to_get.map(d => `doi=${encodeURIComponent(d)}`);
82+
const resp = await fetch(`${BASE_URL}/citations?${encoded_dois.join("&")}`);
83+
if(!resp.ok) {
84+
throw new Error("Failed to retrieve citations!");
9285
}
93-
citations.push(DOI_CACHE[cite]);
94-
}));
86+
let new_cites = await resp.json();
87+
DOI_CACHE = {
88+
...new_cites['citations'],
89+
...DOI_CACHE
90+
};
91+
}
92+
let citations = dois.map(d => DOI_CACHE[d]);
9593
cites_list.html(citations.join("\n\n"));
9694
copy_cites.attr('content', citations.join("\n\n"));
9795
});
9896

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

111102
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']) &&

0 commit comments

Comments
 (0)