diff --git a/ippisite/ippidb/static/js/targetcentric-near-cavities-rows.js b/ippisite/ippidb/static/js/targetcentric-near-cavities-rows.js new file mode 100644 index 0000000000000000000000000000000000000000..c903056e3623479cfadf1b707ec13e48edb19fbe --- /dev/null +++ b/ippisite/ippidb/static/js/targetcentric-near-cavities-rows.js @@ -0,0 +1,22 @@ +$(document).ready(function(){ + $(".asnyc-construction.now[data-cavity-id]").each(function () { + loadNearCavityRows($(this)); + }); +}); + +function loadNearCavityRows($row){ + if($row.length==0) + return; + $row.addClass("loading"); + $.ajax({ + url: '/cavity/'+$row.data("cavityId")+'/near-cavities', + data: {'chaincount':$row.data("chaincount"), 'cavcount':$row.data("cavcount")}, + success: function(data){ + var $data=$(data); + if ($row.hasClass("show")) + $data.addClass("show"); + $data.insertAfter($row); + $row.remove(); + } + }); +} \ No newline at end of file diff --git a/ippisite/ippidb/templates/targetcentric.html b/ippisite/ippidb/templates/targetcentric.html index 4191c16126c2e7a4545ad7fb48dad09472d5dace..05427d984172dbfe09ab178e755456d0f81eae56 100644 --- a/ippisite/ippidb/templates/targetcentric.html +++ b/ippisite/ippidb/templates/targetcentric.html @@ -8,6 +8,10 @@ <link rel="stylesheet" href="/static/css/targetcentric.css"> {% endblock %} {% block content %} +{% block extra_js %} +{{block.super}} +<script src="{% static '/js/targetcentric-near-cavities-rows.js'%}"></script> +{% endblock extra_js %} <div class="inner-wrap"> @@ -236,230 +240,11 @@ Comparison and druggability prediction of protein-ligand binding sites from phar {% with chaincount=forloop.counter %} {% for cavity in cavities %} {% with cavcount=forloop.counter %} - <tr id="cavity_{{ cavity.id }}" class="table-light" > - <th class="zui-sticky-col text-nowrap"> - - <i class="far fa-plus-square" style="cursor: pointer;" data-toggle="collapse" data-target=".collapseme{{ chaincount }}_{{ cavcount }}"></i> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?pdbsearch={{ cavity.chain.pdb.code }}">{{ cavity.chain.pdb.code }}</a> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ cavity.chain.protein.uniprot_id }}"> - {{ cavity.chain.pdb_chain_id }} | {{ cavity.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ cavity.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ cavity.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown"> - {{ cavity.cavity_number }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'networks' %}?search={{ cavity|build_name }}"> Query pocket in pocketome</a> - </div> - </span> - :: - {% if cavity.partner.ligand %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="smiles: {{ cavity.partner.ligand.canonical_smile }}"> - {{ cavity.partner.ligand.pdb_ligand_id }}_{{ cavity.partner.ligand.supplementary_id }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?ligandcode={{ cavity.partner.ligand.pdb_ligand_id }}">Query ligand ID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?similar_to=ECFP4:{{ cavity.partner.ligand.canonical_smile|urlencode }}">Query SMILES in iPPI-DB compounds</a> - </div> - </span> - {% else %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ cavity.partner.chain.protein.uniprot_id }}"> - {{ cavity.partner.chain.pdb_chain_id }} | {{ cavity.partner.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ cavity.partner.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ cavity.partner.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - {% endif %} - </th> - <td>{% if cavity.partner.ligand %}PL{% else %}HD{% endif %}</td> - <td>{{ cavity.volume|floatformat:0 }}</td> - <td>{{ cavity.npr1|floatformat:2 }}</td> - <td>{{ cavity.npr2|floatformat:2 }}</td> - <td>{{ cavity.asphericity|floatformat:2 }}</td> - <td>{{ cavity.eccentricity|floatformat:2 }}</td> - <td>{{ cavity.rgyr|floatformat:2 }}</td> - <td>{{ cavity.spherocityindex|floatformat:2 }}</td> - <td>{{ cavity.ca|floatformat:1 }}</td> - <td>{{ cavity.cz|floatformat:1 }}</td> - <td>{{ cavity.n|floatformat:1 }}</td> - <td>{{ cavity.o|floatformat:1 }}</td> - <td>{{ cavity.og|floatformat:1 }}</td> - <td>{{ cavity.nz|floatformat:1 }}</td> - <td>{{ cavity.od1|floatformat:1 }}</td> - <td>{{ cavity.du|floatformat:1 }}</td> - <td>{{ cavity.t40|floatformat:1 }}</td> - <td>{{ cavity.t40_50|floatformat:1 }}</td> - <td>{{ cavity.t50_60|floatformat:1 }}</td> - <td>{{ cavity.t60_70|floatformat:1 }}</td> - <td>{{ cavity.t70_80|floatformat:1 }}</td> - <td>{{ cavity.t80_90|floatformat:1 }}</td> - <td>{{ cavity.t90_100|floatformat:1 }}</td> - <td>{{ cavity.t100_110|floatformat:1 }}</td> - <td>{{ cavity.t110_120|floatformat:1 }}</td> - <td>{{ cavity.t120|floatformat:1 }}</td> + {% include "targetcentric_cavity_row.html" with chaincount=chaincount cavcount=cavcount %} + <tr class="collapse out collapseme{{ chaincount }}_{{ cavcount }} asnyc-construction" data-cavity-id="{{cavity.id}}" data-cavcount="{{cavcount}}" data-chaincount="{{chaincount}}"> + <td colspan="27"><span class="loader"></span></td> </tr> - {% for distance in cavity.near_cavities %} - {% if cavity == distance.cavity1 %} - <tr class="collapse out collapseme{{ chaincount }}_{{ cavcount }}" style="background-color:rgb({{ distance.distance|get_zscore:avg_std|get_color }})"> - <th class="zui-sticky-col text-nowrap"> - - <a title="{{ distance.distance|get_zscore:avg_std|floatformat:3|intcomma }}" target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?pdbsearch={{ distance.cavity2.chain.pdb.code }}">{{ distance.cavity2.chain.pdb.code }}</a> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ distance.cavity2.chain.protein.uniprot_id }}"> - {{ distance.cavity2.chain.pdb_chain_id }} | {{ distance.cavity2.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ distance.cavity2.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ distance.cavity2.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown"> - {{ distance.cavity2.cavity_number }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'networks' %}?search={{ distance.cavity2|build_name }}"> Query pocket in pocketome</a> - </div> - </span> - :: - {% if distance.cavity2.partner.ligand %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="smiles: {{ distance.cavity2.partner.ligand.canonical_smile }}"> - {{ distance.cavity2.partner.ligand.pdb_ligand_id }}_{{ distance.cavity2.partner.ligand.supplementary_id }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?ligandcode={{ distance.cavity2.partner.ligand.pdb_ligand_id }}">Query ligand ID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?similar_to=ECFP4:{{ distance.cavity2.partner.ligand.canonical_smile|urlencode }}">Query SMILES in iPPI-DB compounds</a> - </div> - </span> - {% else %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ distance.cavity2.partner.chain.protein.uniprot_id }}"> - {{ distance.cavity2.partner.chain.pdb_chain_id }} | {{ distance.cavity2.partner.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ distance.cavity2.partner.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ distance.cavity2.partner.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - {% endif %} - </th> - <td>{% if distance.cavity2.partner.ligand %}PL{% else %}HD{% endif %}</td> - <td>{{ distance.cavity2.volume|floatformat:0 }}</td> - <td>{{ distance.cavity2.npr1|floatformat:2 }}</td> - <td>{{ distance.cavity2.npr2|floatformat:2 }}</td> - <td>{{ distance.cavity2.asphericity|floatformat:2 }}</td> - <td>{{ distance.cavity2.eccentricity|floatformat:2 }}</td> - <td>{{ distance.cavity2.rgyr|floatformat:2 }}</td> - <td>{{ distance.cavity2.spherocityindex|floatformat:2 }}</td> - <td>{{ distance.cavity2.ca|floatformat:1 }}</td> - <td>{{ distance.cavity2.cz|floatformat:1 }}</td> - <td>{{ distance.cavity2.n|floatformat:1 }}</td> - <td>{{ distance.cavity2.o|floatformat:1 }}</td> - <td>{{ distance.cavity2.og|floatformat:1 }}</td> - <td>{{ distance.cavity2.nz|floatformat:1 }}</td> - <td>{{ distance.cavity2.od1|floatformat:1 }}</td> - <td>{{ distance.cavity2.du|floatformat:1 }}</td> - <td>{{ distance.cavity2.t40|floatformat:1 }}</td> - <td>{{ distance.cavity2.t40_50|floatformat:1 }}</td> - <td>{{ distance.cavity2.t50_60|floatformat:1 }}</td> - <td>{{ distance.cavity2.t60_70|floatformat:1 }}</td> - <td>{{ distance.cavity2.t70_80|floatformat:1 }}</td> - <td>{{ distance.cavity2.t80_90|floatformat:1 }}</td> - <td>{{ distance.cavity2.t90_100|floatformat:1 }}</td> - <td>{{ distance.cavity2.t100_110|floatformat:1 }}</td> - <td>{{ distance.cavity2.t110_120|floatformat:1 }}</td> - <td>{{ distance.cavity2.t120|floatformat:1 }}</td> - </tr> - {% elif cavity == distance.cavity2 %} - <tr class="collapse out collapseme{{ chaincount }}_{{ cavcount }}" style="background-color:rgb({{ distance.distance|get_zscore:avg_std|get_color }})"> - <th class="zui-sticky-col text-nowrap"> - <a title="{{ distance.distance|get_zscore:avg_std|floatformat:3|intcomma }}" target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?pdbsearch={{ distance.cavity1.chain.pdb.code }}">{{ distance.cavity1.chain.pdb.code }}</a> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ distance.cavity1.chain.protein.uniprot_id }}"> - {{ distance.cavity1.chain.pdb_chain_id }} | {{ distance.cavity1.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ distance.cavity1.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ distance.cavity1.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - / - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown"> - {{ distance.cavity1.cavity_number }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'networks' %}?search={{ distance.cavity1|build_name }}"> Query pocket in pocketome</a> - </div> - </span> - :: - {% if distance.cavity1.partner.ligand %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="smiles: {{ distance.cavity1.partner.ligand.canonical_smile }}"> - {{ distance.cavity1.partner.ligand.pdb_ligand_id }}_{{ distance.cavity1.partner.ligand.supplementary_id }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?ligandcode={{ distance.cavity1.partner.ligand.pdb_ligand_id }}">Query ligand ID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?similar_to=ECFP4:{{ distance.cavity1.partner.ligand.canonical_smile|urlencode }}">Query SMILES in iPPI-DB compounds</a> - </div> - </span> - {% else %} - <span class="dropdown"> - <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ distance.cavity1.partner.chain.protein.uniprot_id }}"> - {{ distance.cavity1.partner.chain.pdb_chain_id }} | {{ distance.cavity1.partner.chain.protein.short_name }} - </div> - <div class="dropdown-content"> - <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ distance.cavity1.partner.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> - <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ distance.cavity1.partner.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> - </div> - </span> - {% endif %} - </th> - <td>{% if distance.cavity1.partner.ligand %}PL{% else %}HD{% endif %}</td> - <td>{{ distance.cavity1.volume|floatformat:0 }}</td> - <td>{{ distance.cavity1.npr1|floatformat:2 }}</td> - <td>{{ distance.cavity1.npr2|floatformat:2 }}</td> - <td>{{ distance.cavity1.asphericity|floatformat:2 }}</td> - <td>{{ distance.cavity1.eccentricity|floatformat:2 }}</td> - <td>{{ distance.cavity1.rgyr|floatformat:2 }}</td> - <td>{{ distance.cavity1.spherocityindex|floatformat:2 }}</td> - <td>{{ distance.cavity1.ca|floatformat:1 }}</td> - <td>{{ distance.cavity1.cz|floatformat:1 }}</td> - <td>{{ distance.cavity1.n|floatformat:1 }}</td> - <td>{{ distance.cavity1.o|floatformat:1 }}</td> - <td>{{ distance.cavity1.og|floatformat:1 }}</td> - <td>{{ distance.cavity1.nz|floatformat:1 }}</td> - <td>{{ distance.cavity1.od1|floatformat:1 }}</td> - <td>{{ distance.cavity1.du|floatformat:1 }}</td> - <td>{{ distance.cavity1.t40|floatformat:1 }}</td> - <td>{{ distance.cavity1.t40_50|floatformat:1 }}</td> - <td>{{ distance.cavity1.t50_60|floatformat:1 }}</td> - <td>{{ distance.cavity1.t60_70|floatformat:1 }}</td> - <td>{{ distance.cavity1.t70_80|floatformat:1 }}</td> - <td>{{ distance.cavity1.t80_90|floatformat:1 }}</td> - <td>{{ distance.cavity1.t90_100|floatformat:1 }}</td> - <td>{{ distance.cavity1.t100_110|floatformat:1 }}</td> - <td>{{ distance.cavity1.t110_120|floatformat:1 }}</td> - <td>{{ distance.cavity1.t120|floatformat:1 }}</td> - </tr> - {% endif %} - {% endfor %} + {% include "targetcentric_near_cavities.html" with object=cavityXXX %} {% endwith %} {% endfor %} {% endwith %} diff --git a/ippisite/ippidb/templates/targetcentric_cavity_row.html b/ippisite/ippidb/templates/targetcentric_cavity_row.html new file mode 100644 index 0000000000000000000000000000000000000000..3e2fa41c3d649a743f6bd576e014049e619f0416 --- /dev/null +++ b/ippisite/ippidb/templates/targetcentric_cavity_row.html @@ -0,0 +1,87 @@ +{% load customtags %} +{% load humanize %} +<tr XXXid="cavity_{{ cavity.id }}" + {%if near_cavity %} + class="collapse out collapseme{{ chaincount }}_{{ cavcount }}" + style="background-color:rgb({{ score|get_color }})" + {%else%} + class="table-light" + {%endif%}> + <th class="zui-sticky-col text-nowrap"> + {%if not near_cavity %} + <i class="far fa-plus-square" style="cursor: pointer;" data-toggle="collapse" data-target=".collapseme{{ chaincount }}_{{ cavcount }}" + onclick="loadNearCavityRows($('.asnyc-construction[data-cavity-id={{ cavity.id }}]:not(loading)'));"></i> + {%endif%} + <a {%if score %} title="{{ score|floatformat:3|intcomma }}" {%endif%} + target="_blank" + rel="noopener noreferrer" + href="{% url 'cavities' %}?pdbsearch={{ cavity.chain.pdb.code }}">{{ cavity.chain.pdb.code }}</a> + / + <span class="dropdown"> + <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ cavity.chain.protein.uniprot_id }}"> + {{ cavity.chain.pdb_chain_id }} | {{ cavity.chain.protein.short_name }} + </div> + <div class="dropdown-content"> + <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ cavity.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> + <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ cavity.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> + </div> + </span> + / + <span class="dropdown"> + <div class="dropbtn" data-toggle="dropdown"> + {{ cavity.cavity_number }} + </div> + <div class="dropdown-content"> + <a target="_blank" rel="noopener noreferrer" href="{% url 'networks' %}?search={{ cavity|build_name }}"> Query pocket in pocketome</a> + </div> + </span> + :: + {% if cavity.partner.ligand %} + <span class="dropdown"> + <div class="dropbtn" data-toggle="dropdown" title="smiles: {{ cavity.partner.ligand.canonical_smile }}"> + {{ cavity.partner.ligand.pdb_ligand_id }}_{{ cavity.partner.ligand.supplementary_id }} + </div> + <div class="dropdown-content"> + <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?ligandcode={{ cavity.partner.ligand.pdb_ligand_id }}">Query ligand ID in pockets</a> + <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?similar_to=ECFP4:{{ cavity.partner.ligand.canonical_smile|urlencode }}">Query SMILES in iPPI-DB compounds</a> + </div> + </span> + {% else %} + <span class="dropdown"> + <div class="dropbtn" data-toggle="dropdown" title="uniprot: {{ cavity.partner.chain.protein.uniprot_id }}"> + {{ cavity.partner.chain.pdb_chain_id }} | {{ cavity.partner.chain.protein.short_name }} + </div> + <div class="dropdown-content"> + <a target="_blank" rel="noopener noreferrer" href="{% url 'cavities' %}?uniprotid={{ cavity.partner.chain.protein.uniprot_id }}">Query UniprotID in pockets</a> + <a target="_blank" rel="noopener noreferrer" href="{% url 'compound_list' %}?uniprot_id={{ cavity.partner.chain.protein.uniprot_id }}">Query UniprotID as iPPI-DB target</a> + </div> + </span> + {% endif %} + </th> + <td>{% if cavity.partner.ligand %}PL{% else %}HD{% endif %}</td> + <td>{{ cavity.volume|floatformat:0 }}</td> + <td>{{ cavity.npr1|floatformat:2 }}</td> + <td>{{ cavity.npr2|floatformat:2 }}</td> + <td>{{ cavity.asphericity|floatformat:2 }}</td> + <td>{{ cavity.eccentricity|floatformat:2 }}</td> + <td>{{ cavity.rgyr|floatformat:2 }}</td> + <td>{{ cavity.spherocityindex|floatformat:2 }}</td> + <td>{{ cavity.ca|floatformat:1 }}</td> + <td>{{ cavity.cz|floatformat:1 }}</td> + <td>{{ cavity.n|floatformat:1 }}</td> + <td>{{ cavity.o|floatformat:1 }}</td> + <td>{{ cavity.og|floatformat:1 }}</td> + <td>{{ cavity.nz|floatformat:1 }}</td> + <td>{{ cavity.od1|floatformat:1 }}</td> + <td>{{ cavity.du|floatformat:1 }}</td> + <td>{{ cavity.t40|floatformat:1 }}</td> + <td>{{ cavity.t40_50|floatformat:1 }}</td> + <td>{{ cavity.t50_60|floatformat:1 }}</td> + <td>{{ cavity.t60_70|floatformat:1 }}</td> + <td>{{ cavity.t70_80|floatformat:1 }}</td> + <td>{{ cavity.t80_90|floatformat:1 }}</td> + <td>{{ cavity.t90_100|floatformat:1 }}</td> + <td>{{ cavity.t100_110|floatformat:1 }}</td> + <td>{{ cavity.t110_120|floatformat:1 }}</td> + <td>{{ cavity.t120|floatformat:1 }}</td> +</tr> \ No newline at end of file diff --git a/ippisite/ippidb/templates/targetcentric_near_cavities.html b/ippisite/ippidb/templates/targetcentric_near_cavities.html new file mode 100644 index 0000000000000000000000000000000000000000..6d05ad86940d091cf5bc4f3984297c442c6ec48b --- /dev/null +++ b/ippisite/ippidb/templates/targetcentric_near_cavities.html @@ -0,0 +1,10 @@ +{% load customtags %} +{% for distance in object.near_cavities %} + {% with distance.distance|get_zscore:avg_std as score %} + {% if object == distance.cavity1 %} + {% include "targetcentric_cavity_row.html" with chaincount=chaincount cavcount=cavcount cavity=distance.cavity2 score=score near_cavity=True %} + {% elif object == distance.cavity2 %} + {% include "targetcentric_cavity_row.html" with chaincount=chaincount cavcount=cavcount cavity=distance.cavity1 score=score near_cavity=True %} + {% endif %} + {%endwith%} +{% endfor %} \ No newline at end of file diff --git a/ippisite/ippidb/urls.py b/ippisite/ippidb/urls.py index 4a8ed986a0112a93872a9e25708ecfe78d985d13..e90f1b44d9d1019ad22fc51acbde1b8fc59dbd8f 100644 --- a/ippisite/ippidb/urls.py +++ b/ippisite/ippidb/urls.py @@ -74,6 +74,7 @@ urlpatterns = [ ), re_path(r"^targetcentric/$", views.PDBView.as_view(), name="cavities"), re_path(r"^targetcentric/networks$", views.NetworkView.as_view(), name="networks"), + re_path(r"^cavity/(?P<pk>\d+)/near-cavities$", views.NearCavitiesHTMLFragmentView.as_view(), name="near_cavities"), re_path(r"^api/", include(ROUTER.urls)), re_path(r"^compounds/$", views.CompoundListView.as_view(), name="compound_list"), re_path( diff --git a/ippisite/ippidb/views/__init__.py b/ippisite/ippidb/views/__init__.py index db7c984fbfb8cdecfc28dab17d947d0d836405bc..f8a04759e403789621aee300e4eceb688aec9687 100644 --- a/ippisite/ippidb/views/__init__.py +++ b/ippisite/ippidb/views/__init__.py @@ -11,7 +11,7 @@ iPPI-DB views """ from django.contrib.auth.decorators import login_required from django.shortcuts import render -from .targetcentric import PdbViewSet, DistanceViewSet, PDBView, NetworkView +from .targetcentric import PdbViewSet, DistanceViewSet, PDBView, NetworkView, NearCavitiesHTMLFragmentView from .contribute import ippidb_wizard_view, ContributionDetailView from .compound_query import ( CompoundListView, @@ -111,6 +111,7 @@ __all__ = [ PDBView, get_output_job, NetworkView, + NearCavitiesHTMLFragmentView, get_json_network, IppiDbCompoundSitemap, IppiDbContributorsSitemap, diff --git a/ippisite/ippidb/views/targetcentric.py b/ippisite/ippidb/views/targetcentric.py index 40129fc88975506084d91dcfe9fcfb5436af3391..ecc7513df3ea566c4ad907cd8e6d6e82ecbd98d2 100644 --- a/ippisite/ippidb/views/targetcentric.py +++ b/ippisite/ippidb/views/targetcentric.py @@ -4,7 +4,7 @@ iPPI-DB targetcentric views and related classes from itertools import product from functools import reduce from operator import add -from django.views.generic import ListView +from django.views.generic import ListView, DetailView from django.contrib import messages from django.db.models import Case, When, Value, IntegerField, F, Q from rest_framework import viewsets @@ -308,3 +308,16 @@ class NetworkView(ListView): def get_queryset(self): queryset = self.model.objects.all() return queryset.order_by("number") + + +class NearCavitiesHTMLFragmentView(DetailView): + model = Cavity + template_name = "targetcentric_near_cavities.html" + + def get_context_data(self, *, object_list=None, **kwargs): + return dict( + **super().get_context_data(**kwargs), + chaincount=self.request.GET.get('chaincount', '0'), + cavcount=self.request.GET.get('cavcount', '0'), + avg_std=MetaInformation.objects.first(), + ) diff --git a/ippisite/ippisite/db_finder.py b/ippisite/ippisite/db_finder.py new file mode 100644 index 0000000000000000000000000000000000000000..36921dddca7886694f63a591c25cb4e0d7a9658a --- /dev/null +++ b/ippisite/ippisite/db_finder.py @@ -0,0 +1,59 @@ +import os +import subprocess + + +def get_db_ip(): + result = subprocess.run( + [ + "docker", + "ps", + "-f", + "name=%s" % get_guessed_container_name(), + "-q", + ], + stdout=subprocess.PIPE, + ) + ids = result.stdout.decode("utf-8").strip().split("\n") + if len(ids) > 1: + raise Exception("Can't find the DB, too much match") + if len(ids) == 0 or len(ids[0]) == 0: + result = subprocess.run( + [ + "docker", + "ps", + "-f", + "name=_db", + "-q", + ], + stdout=subprocess.PIPE, + ) + ids = result.stdout.decode("utf-8").strip().split("\n") + if len(ids) > 1: + raise Exception( + "Can't find the DB, couldn't guess container name (tried '%s'), " + "and too much match with '_db'" % get_guessed_container_name() + ) + if len(ids) == 0 or len(ids[0]) == 0: + raise Exception("Can't find the DB") + result = subprocess.run( + [ + "docker", + "inspect", + "-f", + "'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'", + ids[0], + ], + stdout=subprocess.PIPE, + ) + return result.stdout.decode("utf-8").strip().replace("'", "") + + +def get_guessed_container_name(): + return ( + str(os.path.dirname(__file__).split(os.path.sep)[-2]).lower().replace("-", "") + + "_db" + ) + + +if __name__ == "__main__": + print(get_db_ip()) diff --git a/ippisite/ippisite/settings.py b/ippisite/ippisite/settings.py index 7d8911659fb21257e24d9e2f3557d95d8a5644e8..2649bc0029c4b6380ed3df10deb4255c4557448b 100644 --- a/ippisite/ippisite/settings.py +++ b/ippisite/ippisite/settings.py @@ -17,6 +17,8 @@ from decouple import config from django.utils.translation import gettext_lazy from socket import gethostname, gethostbyname +from ippisite import db_finder + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) PERSISTENT_DIR = os.path.join(BASE_DIR, 'persistent') @@ -122,13 +124,16 @@ if config("USE_SQLITE_AS_DB", default="False").upper() == "TRUE": } } else: + POSTGRES_HOST = config("POSTGRES_HOST", '') + if not POSTGRES_HOST: + POSTGRES_HOST = db_finder.get_db_ip() DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "NAME": config("POSTGRES_DB"), "USER": config("POSTGRES_USER"), "PASSWORD": config("POSTGRES_PASSWORD"), - "HOST": config("POSTGRES_HOST"), + "HOST": POSTGRES_HOST, "PORT": 5432, } }