diff --git a/ippisite/ippidb/templates/multiselection_modal.html b/ippisite/ippidb/templates/multiselection_modal.html index 3471348002b58e1eb1e6289cc0dbd2c401c77850..13286f330a56834b1d615f176cb430b22a547720 100644 --- a/ippisite/ippidb/templates/multiselection_modal.html +++ b/ippisite/ippidb/templates/multiselection_modal.html @@ -1,65 +1,72 @@ -<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-content"> <div class="modal-header"> <h5 class="modal-title update_modal_title" id="exampleModalLabel">{{ label }}</h5> </div> <div class="modal-body"> - <input id="search-{{ param_name }}" class="typeahead" type="text"> - <script> - var selection{{ param_name }} = [ - {% for element in unselected_list %} - {id:'{{ element.id }}', name:'{{ element.name }}'}, - {% endfor %} + <input id="search-{{ param_name }}" class="typeahead" type="text"> + <script> + var selection{{ param_name }} =[ + {% for element in unselected_list %} + { id: '{{ element.id }}', name: '{{ element.name }}' }, + {% endfor %} ]; - var onSelect = function(evt, obj){ - $('[name="{{ param_name }}"][value="'+ obj.id +'"]').prop('checked', true); - } - multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect); - </script> - <div style="max-height: 15em; overflow-y: auto;"> - {% if on_value == None %} - {% for element in selected_list|dictsort:"name.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.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;"> - {{ element }} - </label> + var onSelect = function (evt, obj) { + $('[name="{{ param_name }}"][value="' + obj.id + '"]').prop('checked', true); + } + multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect); + </script> + <div style="max-height: 15em; overflow-y: auto;"> + {% if on_value == None %} + {% for element in selected_list|dictsort:"name.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.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;"> + {{ 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> - {% 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 class="modal-footer"> <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> \ No newline at end of file diff --git a/ippisite/ippidb/templatetags/customtags.py b/ippisite/ippidb/templatetags/customtags.py index 6adee6e57158ea2e79139d31c98742edc03df8de..63d1b6c816d6347df59b5ce51efd495f844f8c9a 100644 --- a/ippisite/ippidb/templatetags/customtags.py +++ b/ippisite/ippidb/templatetags/customtags.py @@ -3,6 +3,8 @@ import numpy as np import colorsys from django import forms 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.db.models import QuerySet from django.forms.utils import ErrorList, ErrorDict @@ -265,7 +267,7 @@ def get_zscore(distance, avg_std): factor = float(avg_std.normalize_factor) # mean = float(avg_std.average) dist = float(distance) - score = np.exp(-((dist ** 2) / (2 * (factor ** 2)))) + score = np.exp(-((dist**2) / (2 * (factor**2)))) return score @@ -310,3 +312,29 @@ def build_name(cavity): cavity.chain.pdb_chain_id, 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 diff --git a/ippisite/ippidb/views/compound_query.py b/ippisite/ippidb/views/compound_query.py index 0ff5e79be2188737a971c0ca1764bc68f5414c3c..58e411acccd1f8cdb55f56c2eeb66281d58a0a54 100644 --- a/ippisite/ippidb/views/compound_query.py +++ b/ippisite/ippidb/views/compound_query.py @@ -1,6 +1,7 @@ """ iPPI-DB compound query view and related classes """ + import csv import json from collections import OrderedDict @@ -194,9 +195,9 @@ class CompoundListFilterHandler(FilterHandler): # if no value has been set for this filter if not self.value: # selected objects is an empty queryset - self.filter_context[ - "selected_" + self.parameter_name - ] = self.filter_class.objects.none() + self.filter_context["selected_" + self.parameter_name] = ( + self.filter_class.objects.none() + ) objects = self.filter_class.objects if self.additional_filter: objects = objects.filter(**self.additional_filter) @@ -362,7 +363,7 @@ class ExistsFilterHandler(FilterHandler): super().__init__(parameter_name, filter_context, request_get) 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 self.value: # filter queryset on the values not being NULL @@ -372,7 +373,7 @@ class ExistsFilterHandler(FilterHandler): return queryset def post_process(self, compound_ids, queryset): - """ to be called after queryset filtering """ + """to be called after queryset filtering""" pass @@ -387,7 +388,7 @@ class TrueFilterHandler(FilterHandler): super().__init__(parameter_name, filter_context, request_get) 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 self.value: # filter queryset on the values being True @@ -396,7 +397,7 @@ class TrueFilterHandler(FilterHandler): return queryset def post_process(self, compound_ids, queryset): - """ to be called after queryset filtering """ + """to be called after queryset filtering""" pass @@ -418,7 +419,7 @@ class TrueListFilterHandler(object): self.filter_context["filter_on"] = True 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 len(self.values) > 0: @@ -429,7 +430,7 @@ class TrueListFilterHandler(object): return queryset def post_process(self, compound_ids, queryset): - """ to be called after queryset filtering """ + """to be called after queryset filtering""" pass @@ -573,9 +574,9 @@ class CompoundListView(ListView): # get queryset qs = super().get_queryset() # add filters - self.filter_context[ - "disabled" - ] = set() # list of filters disabled by setting others + self.filter_context["disabled"] = ( + set() + ) # list of filters disabled by setting others cfhs = [ CompoundListFilterHandler( PpiFamily, @@ -760,9 +761,9 @@ class CompoundDetailView(DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) try: - context[ - "le_lle_biplot_data" - ] = LeLleBiplotData.objects.get().le_lle_biplot_data + context["le_lle_biplot_data"] = ( + LeLleBiplotData.objects.get().le_lle_biplot_data + ) except LeLleBiplotData.DoesNotExist: context["le_lle_biplot_data"] = [] try: