From 0f39aeceff2a3c500b5a6ffd54c35f63415d742c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr> Date: Wed, 8 Nov 2017 16:48:24 +0100 Subject: [PATCH] compounds list, WIP Former-commit-id: adeba92bffdb7d35210e3ac43a7247352d04dd47 --- ippisite/ippidb/models.py | 6 ++ .../ippidb/templates/biblio_citation.html | 1 + .../ippidb/templates/compound_abstract.html | 47 ++++++++++++++++ ippisite/ippidb/templates/compound_list.html | 56 +++++++++++++++++++ ippisite/ippidb/templates/kekule_display.html | 13 +++++ ippisite/ippidb/urls.py | 1 + ippisite/ippidb/views.py | 19 ++++++- 7 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 ippisite/ippidb/templates/biblio_citation.html create mode 100644 ippisite/ippidb/templates/compound_abstract.html create mode 100644 ippisite/ippidb/templates/compound_list.html create mode 100644 ippisite/ippidb/templates/kekule_display.html diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index ad07f70a..232e595e 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -320,6 +320,12 @@ class Compound(models.Model): mddr_compound = models.ForeignKey( 'MDDRCompoundImport', blank=True, null=True) + @property + def biblio_refs(self): + """ + return all RefCompoundBiblio related to this complex + """ + return RefCompoundBiblio.objects.filter(compound=self) class MDDRActivityClass(models.Model): name = models.CharField('Activity Class', max_length=100, unique=True) diff --git a/ippisite/ippidb/templates/biblio_citation.html b/ippisite/ippidb/templates/biblio_citation.html new file mode 100644 index 00000000..a7cc6b8f --- /dev/null +++ b/ippisite/ippidb/templates/biblio_citation.html @@ -0,0 +1 @@ +<a target="_blank" class="card-link" href="https://www.ncbi.nlm.nih.gov/pubmed/{{ bibliography.id_source }}">{{ bibliography.authors_list }}. {{ authors.biblio_year }}. {{ bibliography.title }} {{ bibliography.journal_name }}. </a> diff --git a/ippisite/ippidb/templates/compound_abstract.html b/ippisite/ippidb/templates/compound_abstract.html new file mode 100644 index 00000000..99b7e740 --- /dev/null +++ b/ippisite/ippidb/templates/compound_abstract.html @@ -0,0 +1,47 @@ +<div class="row m-2 border border-info bg-light"> + <div class="col-5 bg-info"> + <div id="{{ compound.id }}_smilesdisplay" + data-widget="Kekule.ChemWidget.Viewer2D" data-auto-fit="true" + data-toolbar-evoke-modes="[0]" style="width: 200px; height: 200px;"> + </div> + <textarea rows="10" cols="50" id="{{ compound.id }}_smilesvalue" style="display:none;">{{ compound.canonical_smile }}</textarea> + <script> + $(window).on('load', function(){ + kekule_display('{{ compound.id }}_smilesvalue','{{ compound.id }}_smilesdisplay') + }); + </script> + </div> + <div class="col-7"> + <ul class="list-group"> + {% if compound.common_name %} + <li class="list-group-item">Common name: {{ compound.common_name }}</li> + {% endif %} + {% if compound.canonical_smile %} + <li class="list-group-item">Canonical SMILES: {{ compound.canonical_smile }}</li> + {% endif %} + {% if compound.iupac_name %} + <li class="list-group-item">IUPAC name: {{ compound.iupac_name }}</li> + {% endif %} + </ul> + <p>in bibliography</p> + <ul class="list-group"> + {% for biblio_ref in compound.biblio_refs %} + <li class="list-group-item">Mentionned in {% include "biblio_citation.html" with bibliography=biblio_ref.bibliography%} as <i>{{ biblio_ref.compound_name }}</i></li> + {% endfor %} + </ul> + {%if compound.pubchem_id or compound.chembl_id or compound.chemspider_id %} + <p>in other databases</p> + <ul class="list-group"> + {% if compound.pubchem_id %} + <li class="list-group-item">PubChem: <a href="https://pubchem.ncbi.nlm.nih.gov/compound/{{ compound.pubchem_id }}" target="_blank">{{ compound.pubchem_id }}</a></li> + {% endif %} + {% if compound.chembl_id %} + <li class="list-group-item">ChEMBL: <a href="https://www.ebi.ac.uk/chembldb/compound/inspect/{{ compound.chembl_id}}" target="_blank">{{ compound.chembl_id}}</a></li> + {% endif %} + {% if compound.chemspider_id %} + <li class="list-group-item">ChemSpider: <a href="http://www.chemspider.com/Chemical-Structure.{{ compound.chemspider_id}}.html" target="_blank">{{ compound.chemspider_id}}</a></li> + {% endif %} + </ul> + {% endif %} + </div> +</div> diff --git a/ippisite/ippidb/templates/compound_list.html b/ippisite/ippidb/templates/compound_list.html new file mode 100644 index 00000000..f0286625 --- /dev/null +++ b/ippisite/ippidb/templates/compound_list.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} + + +{% block title %}compound{% endblock %} + +{% block content %} + +{% include "kekule_display.html" %} +<div class="container-fluid"> +<div class="row flex-xl-nowrap"> + <div class="col-12 col-md-3 col-xl-2 bd-sidebar"> +<form> + <div class="form-group row"> + <div class="form-check"> + {% for ppi in ppis|slice:":5" %} + <label class="form-check-label"> + {{ ppi.name }} + <input class="form-check-input" type="checkbox" value="{{ ppi.id }}" onchange="this.form.submit()" name="ppi"> + </label> + {% endfor %} + </div> + </div> +</form> +</div> +<main class="col-12 col-md-9 col-xl-10 py-md-3 pl-md-5 bd-content" role="main"> +{% if compounds %} + {% for compound in compounds %} + {% include "compound_abstract.html" with compound=compound %} + {% endfor %} +{% else %} + <p>No bibliographies available.</p> +{% endif %} + </main> +</div> +</div> + +<nav> + <ul class="pagination justify-content-end"> + {% if compounds.has_previous %} + <li class="page-item"> + <a class="page-link" href="?page={{ compounds.previous_page_number }}" tabindex="-1">Previous</a> + </li> + {% endif %} + + <li class="page-item disabled"> + <span class="page-link">Page {{ compounds.number }} of {{ compounds.paginator.num_pages }}.</span> + </li> + + {% if compounds.has_next %} + <li class="page-item"> + <a class="page-link" href="?page={{ compounds.next_page_number }}" tabindex="-1">Next</a> + </li> + {% endif %} + </ul> +</nav> +{% endblock %} diff --git a/ippisite/ippidb/templates/kekule_display.html b/ippisite/ippidb/templates/kekule_display.html new file mode 100644 index 00000000..c6184e1e --- /dev/null +++ b/ippisite/ippidb/templates/kekule_display.html @@ -0,0 +1,13 @@ +<script> + Kekule.Indigo.enable(); + function kekule_display(smiles_id, viewer_id) { + var smi = document.getElementById(smiles_id).value; + var chemViewer = new Kekule.ChemWidget.Viewer(document.getElementById(viewer_id)); + chemViewer.setEnableToolbar(false) + .setEnableDirectInteraction(false) + .setEnableEdit(false) + .setToolButtons([]); + var mol = Kekule.IO.loadFormatData(smi, "smi"); + chemViewer.setChemObj(mol); + } +</script> diff --git a/ippisite/ippidb/urls.py b/ippisite/ippidb/urls.py index 45047aee..0a738f11 100644 --- a/ippisite/ippidb/urls.py +++ b/ippisite/ippidb/urls.py @@ -21,6 +21,7 @@ urlpatterns = [ url(r'^query/chemical/$', views.chemical, name='chemical'), url(r'^biblio/(?P<source>\w{2})(?P<id_source>\w+)$', views.biblio_card, name='biblio_card'), url(r'^biblio/$', views.biblio_list, name='biblio_list'), + url(r'^compound/$', views.compound_list, name='compound_list'), url(r'^tutorials$', views.tutorials, name='tutorials'), url(r'^admin-session$', views.adminSession, name='admin-session'), url(r'^admin-session/add/(?P<step>.+)/$', diff --git a/ippisite/ippidb/views.py b/ippisite/ippidb/views.py index b8243ab0..a9c644b4 100644 --- a/ippisite/ippidb/views.py +++ b/ippisite/ippidb/views.py @@ -2,9 +2,11 @@ import ippidb from django.shortcuts import render from django.http import HttpResponseRedirect, Http404 +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from formtools.wizard.views import SessionWizardView, NamedUrlSessionWizardView + from .forms import BibliographyForm, PDBForm, ProteinForm, ProteinDomainComplexTypeForm, ProteinDomainComplexForm, PpiForm, ProteinFormSet -from .models import Protein, Bibliography, ProteinDomainComplex, RefCompoundBiblio, TestActivityDescription +from .models import Protein, Bibliography, ProteinDomainComplex, RefCompoundBiblio, TestActivityDescription, Compound, Ppi from .ws import get_pdb_uniprot_mapping @@ -152,3 +154,18 @@ def biblio_card(request, source, id_source): return render(request, 'biblio_card.html', {'bibliography': bibliography, 'compound_biblios': refs, 'tad_ppis': tad_ppis}) + +def compound_list(request): + compounds = Compound.objects.all() + paginator = Paginator(compounds, 5) + ppis = Ppi.objects.all() + page = request.GET.get('page') + try: + compounds = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + compounds = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + compounds = paginator.page(paginator.num_pages) + return render(request, 'compound_list.html', {'compounds': compounds, 'ppis': ppis}) -- GitLab