diff --git a/ippisite/ippidb/templates/base.html b/ippisite/ippidb/templates/base.html index c7d2e2f2ef85f02c2a3d4b94d14b647d1766010a..95fdda9866de19f98986394d1e9750dae86d129e 100644 --- a/ippisite/ippidb/templates/base.html +++ b/ippisite/ippidb/templates/base.html @@ -12,6 +12,7 @@ <link rel="stylesheet" href="/static/css/ippidb-typeahead.css"> <link rel="stylesheet" href="/static/academicons-1.8.6/css/academicons.min.css"/> <link rel="stylesheet" href="/static/bootstrap-slider-master/dist/css/bootstrap-slider.min.css"> + <link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css"> <script src="/static/url-polyfill/url-polyfill.js"></script> <script src="/static/jquery/jquery-3.3.1.min.js"></script> diff --git a/ippisite/ippidb/templates/compound_list.html b/ippisite/ippidb/templates/compound_list.html index 3ddaa5aeedf1799306b676d62bd85a22d9566703..240846b04ff2d2572dc82e718dc7d1548514cd29 100644 --- a/ippisite/ippidb/templates/compound_list.html +++ b/ippisite/ippidb/templates/compound_list.html @@ -27,18 +27,86 @@ <main class="col-12" role="main"> <form class="container-fluid"> <div class="m-2 d-flex justify-content-between"> - {% include "multiselection_button.html" with label="PPI Family" param_name="family" %} - {% include "multiselection_button.html" with label="PPI" param_name="ppi" %} - {% include "multiselection_button.html" with label="Disease" param_name="disease" %} - {% include "multiselection_button.html" with label="Organism" param_name="taxonomy" %} - {% include "multiselection_button.html" with label="Bound complex" param_name="boundcomplex" %} - {% include "slider_button.html" with label="Molecular weight" param_name="molecular_weight" %} - {% include "slider_button.html" with label="AlogP" param_name="a_log_p" %} - {% include "slider_button.html" with label="H donors" param_name="nb_donor_h" %} - {% include "slider_button.html" with label="Publications" param_name="pubs" %} - {% include "marvinjs_button.html" %} + <span class="border border-primary rounded p-1 m-1"> + <div class="dropdown btn-group" style="display: inline-flex;"> + <i class="icon icon-common icon-search mr-1 " style="font-size: 1.75rem; vertical-align: middle" title="Text search"></i> + <input id="q" value="{{ q }}" class="form-control" type="text" placeholder="Type search text here" onchange="modifyUrl('q',$('#q').val());"> + </div> + </span> + <span class="border border-primary rounded p-1 m-1"> + <i class="icon icon-conceptual icon-chemical" style="font-size: 1.75rem; vertical-align: middle" title="Compound filters"></i> + <div class="dropdown btn-group"> + <button class="btn btn-primary dropdown-toggle" type="button" id="pcpropMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Physico-Chemical properties + </button> + <div class="dropdown-menu" aria-labelledby="pcpropMenuButton"> + {% include "slider_button.html" with label="H donors" param_name="nb_donor_h" %} + {% include "slider_button.html" with label="Molecular weight" param_name="molecular_weight" %} + {% include "slider_button.html" with label="AlogP" param_name="a_log_p" %} + </div> + </div> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="crMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Chemistry Rules + </button> + <div class="dropdown-menu" aria-labelledby="crMenuButton"> + </div> + </div> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="aeMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Activity and Efficiencies + </button> + <div class="dropdown-menu" aria-labelledby="aeMenuButton"> + </div> + </div> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="mmoaMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Molecular Mechanism of Action + </button> + <div class="dropdown-menu" aria-labelledby="mmoaMenuButton"> + </div> + </div> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="elMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + External Links + </button> + <div class="dropdown-menu" aria-labelledby="elMenuButton"> + </div> + </div> + </span> + <span class="border border-primary rounded p-1 m-1"> + <i class="icon icon-conceptual icon-structures-3d" style="font-size: 1.75rem; vertical-align: middle" title="PPI target filters"></i> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="ptfMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + PPI target filters + </button> + <div class="dropdown-menu" aria-labelledby="ptfMenuButton"> + {% include "multiselection_button.html" with label="Bound complex" param_name="boundcomplex" %} + {% include "multiselection_button.html" with label="PPI Family" param_name="family" %} + {% include "multiselection_button.html" with label="Organism" param_name="taxonomy" %} + {% include "multiselection_button.html" with label="Disease" param_name="disease" %} + {% include "multiselection_button.html" with label="PPI" param_name="ppi" %} + {% include "marvinjs_button.html" %} + </div> + </div> + </span> + + <span class="border border-primary rounded p-1 m-1"> + <i class="icon icon-common icon-flask" style="font-size: 1.75rem; vertical-align: middle" title="Affinity assay filters"></i> + <div class="dropdown btn-group" style="display: inline-flex;"> + <button class="btn btn-primary dropdown-toggle" type="button" id="aaMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Affinity assays + </button> + <div class="dropdown-menu" aria-labelledby="aaMenuButton"> + {% include "slider_button.html" with label="Publications" param_name="pubs" %} + </div> + </div> + </span> + + </div> - <div class="m-2 d-flex "> + + <div class="m-2 d-flex justify-content-between"> <span>{{ paginator.count }} compounds</span> {% if selected_family or selected_ppi or selected_disease or selected_taxonomy or selected_boundcomplex or molecular_weight or a_log_p or nb_donor_h or pubs or similar_to %} <span> @@ -114,7 +182,7 @@ {% if page_obj %} <div class="container-fluid"> {% if display == 'v' %} - <div class="d-flex flex-wrap m-2 justify-content-around"> + <div class="d-flex flex-wrap m-2 justify-content-between"> {% for compound in page_obj %} {% include "compound_v_item.html" with compound=compound %} {% endfor %} diff --git a/ippisite/ippidb/templates/marvinjs_button.html b/ippisite/ippidb/templates/marvinjs_button.html index 6d172689842cc596b60cd93dfebbd457ea205105..c14c65c7a50e5bd2b284821a107c76936a76013a 100644 --- a/ippisite/ippidb/templates/marvinjs_button.html +++ b/ippisite/ippidb/templates/marvinjs_button.html @@ -1,3 +1,3 @@ -<button type="button" class="btn btn-primary btn-lg m-1" style="width: inherit!important" data-toggle="modal" data-target="#modal-marvin"> - <i class="fa fa-filter mr-2"></i> Chemical similarity -</button> +<a class="dropdown-item" href="#" data-toggle="modal" data-target="#modal-marvin"> + <i class="fa fa-filter mr-2"></i> Chemical similarity +</a> \ No newline at end of file diff --git a/ippisite/ippidb/templates/multiselection_button.html b/ippisite/ippidb/templates/multiselection_button.html index 42dd053eed45653053874ec442112eb78cf31bdb..9e638c18802d240340682014630afaa7921e6e89 100644 --- a/ippisite/ippidb/templates/multiselection_button.html +++ b/ippisite/ippidb/templates/multiselection_button.html @@ -1,3 +1,3 @@ -<button type="button" class="btn btn-primary btn-lg m-1" style="width: inherit!important" data-toggle="modal" data-target="#modal-{{ param_name }}"> - <i class="fa fa-filter mr-2"></i>{{ label }} -</button> +<a class="dropdown-item" href="#" data-toggle="modal" data-target="#modal-{{ param_name }}"> + <i class="fa fa-filter mr-2"></i>{{ label }} + </a> diff --git a/ippisite/ippidb/templates/slider_button.html b/ippisite/ippidb/templates/slider_button.html index 42dd053eed45653053874ec442112eb78cf31bdb..1a9f418d488c25f816b6948509423e1538564deb 100644 --- a/ippisite/ippidb/templates/slider_button.html +++ b/ippisite/ippidb/templates/slider_button.html @@ -1,3 +1,3 @@ -<button type="button" class="btn btn-primary btn-lg m-1" style="width: inherit!important" data-toggle="modal" data-target="#modal-{{ param_name }}"> +<a class="dropdown-item" href="#" data-toggle="modal" data-target="#modal-{{ param_name }}"> <i class="fa fa-filter mr-2"></i>{{ label }} -</button> +</a> \ No newline at end of file diff --git a/ippisite/ippidb/views.py b/ippisite/ippidb/views.py index d07509550d46c532a546fe132bb100b4186b4940..90cb4ab783f49b61a1ef04f57ce134850ae44e52 100644 --- a/ippisite/ippidb/views.py +++ b/ippisite/ippidb/views.py @@ -6,7 +6,7 @@ import json import math from collections import OrderedDict -from django.db.models import Max, Min, Count, F +from django.db.models import Max, Min, Count, F, Q from django.db.models.functions import Cast from django.db.models import FloatField from django.shortcuts import render @@ -220,6 +220,35 @@ class CompoundSimilarityFilterHandler(object): """ to be called after queryset filtering """ pass +class TextSearchFilterHandler(object): + + def __init__(self, parameter_name, filter_context, request_get): + self.parameter_name = parameter_name + self.filter_context = filter_context + if request_get.get(self.parameter_name): + self.value = request_get.get(self.parameter_name).strip() + else: + self.value = None + self.filter_context[self.parameter_name] = self.value + + def process(self, queryset): + """ to be called during queryset filtering """ + if self.value: + # filter on: + # compound common name + # PPI family name + # bound complex protein short name + # disease name + queryset = queryset.filter(Q(common_name__icontains=self.value) | + Q(compoundaction__ppi__family__name__icontains=self.value) | + Q(compoundaction__ppi_id__ppicomplex__complex__protein__short_name__icontains=self.value) | + Q(compoundaction__ppi__diseases__name__icontains=self.value) ) + return queryset + + def post_process(self, compound_ids, queryset): + """ to be called after queryset filtering """ + pass + class CompoundRangeFilterHandler(object): def __init__(self, parameter_name, filter_context, request_get): @@ -344,6 +373,7 @@ class CompoundListView(ListView): CompoundRangeFilterHandler('nb_donor_h', self.filter_context, self.request.GET), CompoundRangeFilterHandler('pubs', self.filter_context, self.request.GET), CompoundSimilarityFilterHandler('similar_to', self.filter_context, self.request.GET), + TextSearchFilterHandler('q', self.filter_context, self.request.GET), ] for cfh in cfhs: qs = cfh.process(qs)