From 5c7fd64c4cfa89e4b8e593676694d495642abda5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr>
Date: Wed, 11 Apr 2018 16:52:02 +0200
Subject: [PATCH] add model and template code for compound pharmacology tab

still missing:
- sort pXC50 with ki > kd > ic50 > ec50 rule
- add PPI families in the model (and migrate them)


Former-commit-id: 222c0792c744baa037d5c109337d865669e4fa1a
---
 ippisite/ippidb/models.py                    | 25 ++++++++++
 ippisite/ippidb/templates/compound_card.html | 49 ++++++++++++++++++++
 2 files changed, 74 insertions(+)

diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 9031e296..6b3b1ac3 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -451,6 +451,21 @@ class Compound(models.Model):
         ppi_name = best_activity_car.test_activity_description.ppi.name
         return ppi_name
 
+    @property
+    def bioch_tests_count(self):
+        """
+        return the number of associated biochemical tests
+        """
+        return self.compoundactivityresult_set.all().filter(test_activity_description__test_type='BIOCH').count()
+
+    @property
+    def cell_tests_count(self):
+        """
+        return the number of associated cell tests
+        """
+        return self.compoundactivityresult_set.all().filter(test_activity_description__test_type='CELL').count()
+
+
 class LeLleBiplotData(models.Model):
     le_lle_biplot_data = models.CharField('LE-LLE biplot JSON data', max_length=150000, blank=True, null=True)
 
@@ -561,6 +576,13 @@ class TestActivityDescription(models.Model):
         else:
             return self.ppi.get_ppi_bound_complexes()
 
+    @property
+    def protein_domain_partner_complex(self):
+        for ppic in self.ppi.ppicomplex_set.all():
+            if hasattr(ppic.complex,'proteindomainpartnercomplex'):
+                return ppic.complex.proteindomainpartnercomplex
+        return None
+
 
 class CompoundActivityResult(models.Model):
     MODULATION_TYPES = (
@@ -592,6 +614,9 @@ class CompoundActivityResult(models.Model):
     def __str__(self):
         return 'Compound activity result for {} test {} on {}'.format(self.activity_type, self.test_activity_description.id, self.compound.id)
 
+    def is_best(self):
+        return self.compound.best_pXC50_compound_activity_result.id == self.id
+
 class TestCytotoxDescription(models.Model):
     biblio = models.ForeignKey(Bibliography, models.CASCADE)
     test_name = models.CharField('Cytotoxicity test name', max_length=100)
diff --git a/ippisite/ippidb/templates/compound_card.html b/ippisite/ippidb/templates/compound_card.html
index be68a796..889b110f 100644
--- a/ippisite/ippidb/templates/compound_card.html
+++ b/ippisite/ippidb/templates/compound_card.html
@@ -166,6 +166,55 @@
               </script>
             </div>
             </div>
+            <div class="card col-sm-12 col-md-12">
+              <h5 class="card-header">Summary</h5>
+              <div class="card-body row">
+                <div class="col-md-4">
+                    <h6>Bibliographic ressources</h6>
+                    <p>{{ compound.biblio_refs.count }}</p>
+                </div>
+                <div class="col-md-4">
+                    <h6>Biochemical tests</h6>
+                    <p>{{ compound.bioch_tests_count }}</p>
+                </div>
+                <div class="col-md-4">
+                    <h6>Cellular tests</h6>
+                    <p>{{ compound.cell_tests_count }}</p>
+                </div>
+              </div>
+            </div>
+            <div class="card col-sm-12 col-md-12">
+              <h5 class="card-header">Pharmacological data</h5>
+              <div class="card-body">
+                    <table class="table table-sm col-sm-12 col-md-6">
+                      <thead>
+                        <tr>
+                          <th class="col-sm-1" scope="col">Bibliography</th>
+                          <th class="col-sm-1" scope="col">Target</th>
+                          <th class="col-sm-1" scope="col">Competition</th>
+                          <th class="col-sm-2" scope="col">Assay type</th>
+                          <th class="col-sm-5" scope="col">Assay name</th>
+                          <th class="col-sm-1" scope="col">Activity type</th>
+                          <th class="col-sm-1" scope="col">Activity</th>
+                        </tr>
+                      </thead>
+                      <tbody>
+                        {% for car in compound.compoundactivityresult_set.all %}
+                        <tr {% if car.is_best %}class="border border-primary"{% endif %}>
+                          <td>{% include "biblio_simplelink.html" with bibliography=car.test_activity_description.biblio %}</td>
+                          <td>{{ car.test_activity_description.protein_domain_bound_complex.name }} {{ car.test_activity_description.protein_domain_bound_complex.protein.uniprot_id }}</td>
+                          <td>{{ car.test_activity_description.protein_domain_partner_complex.name }} {{ car.test_activity_description.protein_domain_partner_complex.protein.uniprot_id }}</td>
+                          <td>{{ car.test_activity_description.get_test_type_display }}</td>
+                          <td>{{ car.test_activity_description.test_name }}</td>
+                          <td>{{ car.get_activity_type_display }}</td>
+                          <td>{{ car.activity|floatformat:2 }}</td>
+                        </tr>
+                        {% endfor %}
+                      </tbody>
+                    </table> 
+              </div>
+            </div>
+              
           </div>
           <div class="tab-pane fade" id="v-pills-drugsimilarity" role="tabpanel" aria-labelledby="v-pills-drugsimilarity-tab">
           </div>
-- 
GitLab