Skip to content

Commit

Permalink
Change navbar search to search both genes and ontology terms. Will
Browse files Browse the repository at this point in the history
redirect results to page depending on choice. Closes #49
  • Loading branch information
elserj committed Nov 10, 2023
1 parent 54de9d0 commit ae4f9e3
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 16 deletions.
12 changes: 10 additions & 2 deletions api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@


class OntologyTermDocumentSerializer(DocumentSerializer):
ESscore = serializers.SerializerMethodField()

def get_ESscore(self, obj):
return obj.meta.score
class Meta:
document = annotations_documents.OntologyTermDocument
fields = (
Expand All @@ -22,6 +26,10 @@ class Meta:


class GeneDocumentSerializer(DocumentSerializer):
ESscore = serializers.SerializerMethodField()

def get_ESscore(self, obj):
return obj.meta.score
class Meta:
document = genes_documents.GeneDocument
fields = (
Expand All @@ -42,8 +50,8 @@ class Meta:
'dbname',
'fullname',
)


class TaxonSerializer(serializers.ModelSerializer):
class Meta:
model = Taxon
Expand Down
1 change: 1 addition & 0 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@
path('autocomplete_genes/', views.GeneAPIView.as_view(), name='autocomplete_genes'),
path('autocomplete_dbxrefs/', views.DBXrefAPIView.as_view(), name='autocomplete_dbxrefs'),
path('autocomplete_taxon/', views.TaxonAPIView.as_view(), name='autcomplete_taxon'),
path('autocomplete_genes_and_onto_terms/', views.GenesAndTermsAPIView.as_view(), name='autocomplete_combined'),

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
43 changes: 41 additions & 2 deletions api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ def get(self, request, *args, **kwargs):
fields=["onto_term^10", "term_name^5", "term_definition^3", "term_synonyms"])
#Convert to JSON
serializers = OntologyTermDocumentSerializer(terms, many=True)
for element in serializers.data:
del element['ESscore']
return Response(serializers.data)
else:
return Response(None)
Expand All @@ -55,11 +57,48 @@ def get(self, request, *args, **kwargs):
"summary", "description", "synonyms"])
#Convert to JSON
serializers = GeneDocumentSerializer(terms, many=True)
for element in serializers.data:
del element['ESscore']

return Response(serializers.data)
else:
return Response(None)


class GenesAndTermsAPIView(APIView):
renderer_classes = [JSONRenderer]

def get(self, request, *args, **kwargs):
max_items = 5
q = request.GET.get('q')

if q:
if ':' in q:
q = q.replace(':', '\":\"')
search_term = "*" + q + "*"
gene_terms = ESGeneDocument.search().extra(size=max_items).query("multi_match", query=search_term,
fields=["gene_id^10", "name^5", "symbol^3",
"summary", "description", "synonyms"])
onto_terms = ESOntologyTermDocument.search().extra(size=max_items).query("multi_match", query=search_term,
fields=["onto_term^10", "term_name^5", "term_definition^3", "term_synonyms"])
genes_serializer = GeneDocumentSerializer(gene_terms, many=True)
onto_serializer = OntologyTermDocumentSerializer(onto_terms, many=True)

combined_data = genes_serializer.data + onto_serializer.data
def ESscore(e):
return e['ESscore']
combined_data.sort(reverse=True, key=ESscore)

# Now that they are sorted, remove the ESscore fields
for element in combined_data:
del element['ESscore']

return Response(combined_data)
else:
return Response(None)



#DBXrefs are few enough in number no need to index in elasticsearch, but an autocomplete endpoint might still be nice
class DBXrefAPIView(APIView):
renderer_classes = [JSONRenderer]
Expand All @@ -77,8 +116,8 @@ def get(self, request, *args, **kwargs):
return Response(serializers.data)
else:
return Response(None)


class TaxonAPIView(APIView):
renderer_classes = [JSONRenderer]

Expand Down
43 changes: 31 additions & 12 deletions templates/navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,39 @@
$("#id_genes_search").autocomplete({
source: function (request, response) {
$.ajax({
url: "{% url 'api:autocomplete_genes' %}",
url: "{% url 'api:autocomplete_combined' %}",
dataType: "json",
data: {
q: request.term
},
success: function(data) {
response($.map(data, function (item) {
var label_text = item.gene_id;
if (item.symbol){
label_text = item.symbol + " - " + label_text;
}
if (item.synonyms){
label_text = label_text + " - " + item.synonyms;
if (item.gene_id) {
var label_text = item.gene_id;
if (item.symbol) {
label_text = item.symbol + " - " + label_text;
}
if (item.synonyms) {
label_text = label_text + " - " + item.synonyms;
}
return {
label: label_text,
value: item.gene_id,
type: 'gene'
};
}else{
var label_text = item.onto_term;
if (item.term_name) {
label_text = label_text + " - " + item.term_name;
}
return {
label: label_text,
value: item.onto_term,
type: 'onto_term',
id: item.id

}
}
return {
label: label_text,
value: item.gene_id,
};
}));
}
})
Expand All @@ -37,6 +52,10 @@
select: function(event, ui) {
event.preventDefault();
$(this).val(ui.item.value);
if (ui.item.type == 'onto_term') {
// Change the form action in this case
$('form').attr('action', "/annotations/onto_term/" + ui.item.id);
}
$(this).closest('form').submit();
},
focus: function (event, ui) {
Expand Down Expand Up @@ -68,7 +87,7 @@
</ul>
<form class="form-inline my-2 my-lg-0" method="GET" action="{% url 'genes:search' %}">
<div>
<input class="form-control mr-sm-2" placeholder="Search for genes: CONSTANS, AT5G15850" type="search" name="search" size="40" id="id_genes_search">
<input class="form-control mr-sm-2" placeholder="Search: CONSTANS, AT5G15850, PO:0009032 (petal)" type="search" name="search" size="40" id="id_genes_search">
<button class="btn btn-primary" type="submit"><i class="fa fa-search"></i> </button>
</div>
</form>
Expand Down

0 comments on commit ae4f9e3

Please sign in to comment.