From 1ea5460113db01c6fbd9ac45fe5eff308b5c73ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20M=C3=A9nager?= <herve.menager@pasteur.fr>
Date: Thu, 19 Dec 2019 15:27:12 +0100
Subject: [PATCH] make Compound families a cached property to have it ready in
 qs

this is to FIX #168
---
 .../migrations/0040_compound_families.py       | 18 ++++++++++++++++++
 ippisite/ippidb/models.py                      | 12 +++++-------
 ippisite/ippidb/templates/compound_t_list.html |  2 +-
 3 files changed, 24 insertions(+), 8 deletions(-)
 create mode 100644 ippisite/ippidb/migrations/0040_compound_families.py

diff --git a/ippisite/ippidb/migrations/0040_compound_families.py b/ippisite/ippidb/migrations/0040_compound_families.py
new file mode 100644
index 00000000..fa2b630f
--- /dev/null
+++ b/ippisite/ippidb/migrations/0040_compound_families.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.1 on 2019-12-19 14:19
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0039_auto_20191216_1438'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='compound',
+            name='families',
+            field=models.TextField(blank=True, null=True, verbose_name='PPI family names'),
+        ),
+    ]
diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 6af2ed38..70d5d2e2 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -714,6 +714,8 @@ class Compound(AutoFillableModel):
     best_activity_ppi_family_name = models.CharField(
         "Best activity PPI family name", max_length=30, null=True, blank=True
     )
+    families = models.TextField("PPI family names", null=True, blank=True)
+
     le = models.FloatField(verbose_name="Ligand efficiency", null=True, blank=True)
     lle = models.FloatField(verbose_name="Lipophilic efficiency", null=True, blank=True)
     lipinsky_mw = models.BooleanField("MW ok for Lipinsky", null=True, blank=True)
@@ -875,13 +877,6 @@ class Compound(AutoFillableModel):
             .count()
         )
 
-    @property
-    def families(self):
-        """
-        return the all PPI families for PPIs involved in the compound activity of the compound
-        """
-        return list(set([ca.ppi.family for ca in self.compoundaction_set.all()]))
-
     @property
     def sorted_similar_drugbank_compounds(self):
         return self.drugbankcompoundtanimoto_set.order_by("-tanimoto")
@@ -1283,6 +1278,9 @@ class Contribution(models.Model):
 
 
 def update_compound_cached_properties():
+    for c in Compound.objects.all():
+        c.families = ', '.join(list(set([ca.ppi.family.name for ca in c.compoundaction_set.all()])))
+        c.save()
     Compound.objects.update(
         pubs=Subquery(
             Compound.objects.filter(id=OuterRef("id"))
diff --git a/ippisite/ippidb/templates/compound_t_list.html b/ippisite/ippidb/templates/compound_t_list.html
index 43fba1c5..09b6e2ec 100644
--- a/ippisite/ippidb/templates/compound_t_list.html
+++ b/ippisite/ippidb/templates/compound_t_list.html
@@ -40,7 +40,7 @@
         <td scope="col">{{ compound.common_name|default_if_none:"-" }}</td>
       {% endif %}
       {% if "families" in fields %}
-        <td scope="col">{% for family in compound.families %}{{ family.name }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
+        <td scope="col">{{ compound.families }}</td>
       {% endif %}
       {% if "pubs" in fields %}
         <td scope="col">{{ compound.pubs }}</td>
-- 
GitLab