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