Skip to content
Snippets Groups Projects
Commit 49b3d117 authored by Fabien  MAREUIL's avatar Fabien MAREUIL
Browse files

bug fix: filter compounds issue #278

parent e9a319ee
No related branches found
No related tags found
No related merge requests found
Pipeline #125112 passed
<div class="modal fade" id="modal-{{ param_name }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> {% load customtags %}
<div class="modal fade" id="modal-{{ param_name }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title update_modal_title" id="exampleModalLabel">{{ label }}</h5> <h5 class="modal-title update_modal_title" id="exampleModalLabel">{{ label }}</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<input id="search-{{ param_name }}" class="typeahead" type="text"> <input id="search-{{ param_name }}" class="typeahead" type="text">
<script> <script>
var selection{{ param_name }} = [ var selection{{ param_name }} =[
{% for element in unselected_list %} {% for element in unselected_list %}
{id:'{{ element.id }}', name:'{{ element.name }}'}, { id: '{{ element.id }}', name: '{{ element.name }}' },
{% endfor %} {% endfor %}
]; ];
var onSelect = function(evt, obj){ var onSelect = function (evt, obj) {
$('[name="{{ param_name }}"][value="'+ obj.id +'"]').prop('checked', true); $('[name="{{ param_name }}"][value="' + obj.id + '"]').prop('checked', true);
} }
multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect); multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect);
</script> </script>
<div style="max-height: 15em; overflow-y: auto;"> <div style="max-height: 15em; overflow-y: auto;">
{% if on_value == None %} {% if on_value == None %}
{% for element in selected_list|dictsort:"name.lower" %} {% for element in selected_list|dictsort:"name.lower" %}
<div class="form-check col-12"> <div class="form-check col-12">
<label class="form-check-label"> <label class="form-check-label">
<input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;"> <input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked
{{ element }} value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
</label> {{ element }}
</label>
</div>
{% endfor %}
{% for element in unselected_list|dictsort:"name.lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input class="form-check-input text-right" type="checkbox" value="{{ element.id }}"
name="{{ param_name }}" style="width: auto; margin-right: 1em;">
{{ element }}
</label>
</div>
{% endfor %}
{% endif %}
{% if on_value != None %}
{% for element in selected_list|dictsort:"lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked
value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
{{ element.name }} {{ element }}
</label>
</div>
{% endfor %}
{% for element in unselected_list|dictsort:"lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input class="form-check-input text-right" type="checkbox" value="{{ element }}" name="{{ param_name }}"
style="width: auto; margin-right: 1em;">
{{ element.name }} {{ element }}
</label>
</div>
{% endfor %}
{% endif %}
</div> </div>
{% endfor %}
{% for element in unselected_list|dictsort:"name.lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input class="form-check-input text-right" type="checkbox" value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
{{ element }}
</label>
</div>
{% endfor %}
{% endif %}
{% if on_value != None %}
{% for element in selected_list|dictsort:"lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
{{ element.name }} {{ element }}
</label>
</div>
{% endfor %}
{% for element in unselected_list|dictsort:"lower" %}
<div class="form-check col-12">
<label class="form-check-label">
<input class="form-check-input text-right" type="checkbox" value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
{{ element.name }} {{ element }}
</label>
</div>
{% endfor %}
{% endif %}
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary close_modal" data-dismiss="modal">x Close</button> <button type="button" class="btn btn-secondary close_modal" data-dismiss="modal">x Close</button>
<button type="button" class="btn btn-primary" onclick="$('#modal-{{ param_name }}').modal('hide'); queryUrl.unPage(); queryUrl.changeSelection('{{ param_name }}');">Apply</button> <button type="button" class="btn btn-primary"
onclick="$('#modal-{{ param_name }}').modal('hide'); queryUrl.unPage(); queryUrl.changeSelection('{{ param_name }}');">Apply</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
\ No newline at end of file
...@@ -3,6 +3,8 @@ import numpy as np ...@@ -3,6 +3,8 @@ import numpy as np
import colorsys import colorsys
from django import forms from django import forms
from django import template from django import template
from django.db.models import F, Func
from django.core.exceptions import FieldError
from django.contrib.messages.storage.base import Message from django.contrib.messages.storage.base import Message
from django.db.models import QuerySet from django.db.models import QuerySet
from django.forms.utils import ErrorList, ErrorDict from django.forms.utils import ErrorList, ErrorDict
...@@ -265,7 +267,7 @@ def get_zscore(distance, avg_std): ...@@ -265,7 +267,7 @@ def get_zscore(distance, avg_std):
factor = float(avg_std.normalize_factor) factor = float(avg_std.normalize_factor)
# mean = float(avg_std.average) # mean = float(avg_std.average)
dist = float(distance) dist = float(distance)
score = np.exp(-((dist ** 2) / (2 * (factor ** 2)))) score = np.exp(-((dist**2) / (2 * (factor**2))))
return score return score
...@@ -310,3 +312,29 @@ def build_name(cavity): ...@@ -310,3 +312,29 @@ def build_name(cavity):
cavity.chain.pdb_chain_id, cavity.chain.pdb_chain_id,
cavity.cavity_number, cavity.cavity_number,
) )
@register.filter
def dictsort(qs, arg):
if isinstance(qs, set):
if "lower" in arg:
return sorted(qs, key=str.casefold)
else:
return sorted(qs)
if isinstance(qs, QuerySet):
if "lower" in arg:
filter_param = arg.split(".")[0]
try:
qs = qs.annotate(lower_property=Func(F(filter_param), function="LOWER"))
return qs.order_by("lower_property")
except (FieldError, AttributeError):
return qs
else:
filter_param = arg
try:
qs = qs.annotate(property=filter_param)
return qs.order_by("property")
except (FieldError, AttributeError):
return qs
return qs
""" """
iPPI-DB compound query view and related classes iPPI-DB compound query view and related classes
""" """
import csv import csv
import json import json
from collections import OrderedDict from collections import OrderedDict
...@@ -194,9 +195,9 @@ class CompoundListFilterHandler(FilterHandler): ...@@ -194,9 +195,9 @@ class CompoundListFilterHandler(FilterHandler):
# if no value has been set for this filter # if no value has been set for this filter
if not self.value: if not self.value:
# selected objects is an empty queryset # selected objects is an empty queryset
self.filter_context[ self.filter_context["selected_" + self.parameter_name] = (
"selected_" + self.parameter_name self.filter_class.objects.none()
] = self.filter_class.objects.none() )
objects = self.filter_class.objects objects = self.filter_class.objects
if self.additional_filter: if self.additional_filter:
objects = objects.filter(**self.additional_filter) objects = objects.filter(**self.additional_filter)
...@@ -362,7 +363,7 @@ class ExistsFilterHandler(FilterHandler): ...@@ -362,7 +363,7 @@ class ExistsFilterHandler(FilterHandler):
super().__init__(parameter_name, filter_context, request_get) super().__init__(parameter_name, filter_context, request_get)
def process(self, queryset): def process(self, queryset):
""" to be called during queryset filtering """ """to be called during queryset filtering"""
# if a value has been set for this filter # if a value has been set for this filter
if self.value: if self.value:
# filter queryset on the values not being NULL # filter queryset on the values not being NULL
...@@ -372,7 +373,7 @@ class ExistsFilterHandler(FilterHandler): ...@@ -372,7 +373,7 @@ class ExistsFilterHandler(FilterHandler):
return queryset return queryset
def post_process(self, compound_ids, queryset): def post_process(self, compound_ids, queryset):
""" to be called after queryset filtering """ """to be called after queryset filtering"""
pass pass
...@@ -387,7 +388,7 @@ class TrueFilterHandler(FilterHandler): ...@@ -387,7 +388,7 @@ class TrueFilterHandler(FilterHandler):
super().__init__(parameter_name, filter_context, request_get) super().__init__(parameter_name, filter_context, request_get)
def process(self, queryset): def process(self, queryset):
""" to be called during queryset filtering """ """to be called during queryset filtering"""
# if a value has been set for this filter # if a value has been set for this filter
if self.value: if self.value:
# filter queryset on the values being True # filter queryset on the values being True
...@@ -396,7 +397,7 @@ class TrueFilterHandler(FilterHandler): ...@@ -396,7 +397,7 @@ class TrueFilterHandler(FilterHandler):
return queryset return queryset
def post_process(self, compound_ids, queryset): def post_process(self, compound_ids, queryset):
""" to be called after queryset filtering """ """to be called after queryset filtering"""
pass pass
...@@ -418,7 +419,7 @@ class TrueListFilterHandler(object): ...@@ -418,7 +419,7 @@ class TrueListFilterHandler(object):
self.filter_context["filter_on"] = True self.filter_context["filter_on"] = True
def process(self, queryset): def process(self, queryset):
""" to be called during queryset filtering """ """to be called during queryset filtering"""
# if a value has been set for this filter # if a value has been set for this filter
if len(self.values) > 0: if len(self.values) > 0:
...@@ -429,7 +430,7 @@ class TrueListFilterHandler(object): ...@@ -429,7 +430,7 @@ class TrueListFilterHandler(object):
return queryset return queryset
def post_process(self, compound_ids, queryset): def post_process(self, compound_ids, queryset):
""" to be called after queryset filtering """ """to be called after queryset filtering"""
pass pass
...@@ -573,9 +574,9 @@ class CompoundListView(ListView): ...@@ -573,9 +574,9 @@ class CompoundListView(ListView):
# get queryset # get queryset
qs = super().get_queryset() qs = super().get_queryset()
# add filters # add filters
self.filter_context[ self.filter_context["disabled"] = (
"disabled" set()
] = set() # list of filters disabled by setting others ) # list of filters disabled by setting others
cfhs = [ cfhs = [
CompoundListFilterHandler( CompoundListFilterHandler(
PpiFamily, PpiFamily,
...@@ -760,9 +761,9 @@ class CompoundDetailView(DetailView): ...@@ -760,9 +761,9 @@ class CompoundDetailView(DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
try: try:
context[ context["le_lle_biplot_data"] = (
"le_lle_biplot_data" LeLleBiplotData.objects.get().le_lle_biplot_data
] = LeLleBiplotData.objects.get().le_lle_biplot_data )
except LeLleBiplotData.DoesNotExist: except LeLleBiplotData.DoesNotExist:
context["le_lle_biplot_data"] = [] context["le_lle_biplot_data"] = []
try: try:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment