From 5b7e42ef3555fc11ab73d1c27e79e634e8d7f62b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr>
Date: Thu, 18 May 2017 21:09:47 +0200
Subject: [PATCH] add methods to retrieve complexes

from PPI, CompoundAction, TestActivityDescription
fixes #37
---
 ippisite/db.sqlite3       | Bin 569344 -> 569344 bytes
 ippisite/ippidb/models.py |  34 ++++++++++++++++++++++++++--------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/ippisite/db.sqlite3 b/ippisite/db.sqlite3
index 8222fa0613fb7defe327ce8452ea41e836d26eeb..a2a3a8a36b19811ac48665f8b503b0b9888dadd0 100644
GIT binary patch
delta 6107
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
E0QQcPU;qFB

delta 5452
zcmb{0d2CeI6$bD#Z{B#0?Roc(ml^N&cwfNA7_$>FtMS6VnKcd&2$VEV6-7~0_3@f2
ziJ~;3A;Rp7*>{7%X5aUHG5aDKMOE5HNfosbt<tLZoIC17`MU^xzwg}{0~Ytpd)JF!
z<Sc%Xvn18<#r+|Dh{}D9Em={|Al<hyc`1f^x;I)o+p0o;_IcrX=uLMuHs9Xn%~(3B
zbXGt#xwBmhnwl2Oo&BoHqEG|BJj#=?^jYZ$oC#*`eD^49e(eKqXlY$pATAMp_G{_e
zW%<SapDqU8a(Da5pE>8PH=7o{{$5>jp}RLW?|WhdKIkm#=qz(pd}qV+D7VX40MCf|
z@RWERo)A;vF);@oX&!1GXzmlQ!9C(t=p?4WU1B=i(O0*LnQ)7k0XOw)H}q@QHTE@f
zCR`<Ez!klESubAFR~Pkb7l`R_o|p>fh$(QEm;`5t32>Si2d9WJa8fUxAnM^bQ3uC}
zS~yB9gd;Zj1{@~l!69NUbPx^DPRxdbngg0P&3>X0_7St7m6!&5HG4F>HM=xBH9Iuh
zHQS<W{=%*La*JlOW|L;4rbV-XXn^&^WLQT`gtf$YSVN43)x>C6MT~-#L_Mq^>R>rh
z1I@%DSQY~vM#wm3sa@c88-~#fp0Snil&yd#Y&tw<yTPNd55qnPd!H?Wdu#!8vL$er
z&4fGQ>)UKG++wrfCTnNHjqn?;hrPxY!&Np5u7uYwhu1H$A-EWR{Q{c_=h<{P$ELzr
zHW|*aK{(AO!YMW$PLj6ahZDRY;CR?$tPhT|z2OMk6ArUI;1Js#I@oe(XUpIqTM7r*
zuF%GIf&FYD>|^txmCb{_O4~5<U=J_k!tSuU!tM;agUx~MY&L8QyEW_<HUl<?-4u3X
z*p{#x*fdzrrocL{dxZMGPlC0)5P&so0<31^U==H2C2PTou*=z4XlDDuvi27qkKYik
zW^a{IU;TslPJAu?C?1Qu;+i-wPKXZCDz=Lju}XX)elI>0ws=pxEf$J7VuqL`MvH1u
zCHjgA(M9Bm3=tGkpm4RtHO{we)0t&LbhPQr)XdOK*G$t))ih|PXeMhWX(nnWXvS;C
zX~t^CXhv&BF}72$FY7e5ni|bWO|@o(X1HdUW~gR}X0WD8Ge|Q~^NMDGroYDSr|qlh
zqv@^brRk}u)b!9)Xu504HQh92no><yO&3jxrdU&CYYR06ntV;3CRdZA$<~B4S(;2u
zh9+H;rb*SLXp%KanxNV7?=ePn$W`6!UE;1WWVPB9{}8t6j&>DM6jBsW<WuBP<Wl5N
zWK)DFvM4esGAPn1(kN0XQYexsk|=@{0g6P51d4cyI10b%?icNnR0V}a;iHJ9h@pt4
zKngEK6orSvY+r0V|Iv14c_7+l{KDvi&P=Wgj9%!>;5y%^L}xnJ*NqBvrg5EWq@y#H
z>l~vSIt`IJB~m9x>LjkO8Aa$!<oc>nfX)P}wlU2pL1#QKPd75r8ON1Z$8w!%6r(eS
z>kK0cozao^j*7guK2qzr@|V?e<u9v=ykTVI4R&>SIfTxL$eV|A<$upGuKYa@<vPVk
zMP~@tNk%d{gSk#Hg6LFn9cLt>Gl=ULBOaZB;Wzlvd4+4eA<!AX)vlx7pL?z0L#H3t
zg+_05`f`24=!s4ruJeo@==A0~*XWK;FRl$nIXXSL&Nj->sSMXrbb5qqS9B`EwF^4k
zxi%Vw=#<;sXBqkEbmKbB$U~<rQcJ@%7oDz=+9gs;BDFYNbI>UY*KBkOBeft>^L4e2
z40Q6s%c|x^YEGnPM{0;`gOP?#7T3u}3ObowCmKoUWN;mC1kg$6I@U-)Cync9BMzNZ
zuA>ZzPKqZ)o4?+$&`IXyI;u%rYm8WQf*mhyx6j{ZHvX8^(&TSx3UNlt)=;_WZ&^$W
z`<qPvN9Gc<!(8HVHQH7I$RFf4@=N(p-jL_y5!ouY$kp<5`LX<sd`B*njdHTAmqTP9
zStj#js`Se!@uT=&-LamFPH{z?676D_x>qe1pNZdz_eGPKr|weY#YizwREiQ2QuimH
zFszr>x7JtIW9yc6!8&H`x3*bptuKPsC)Q%?U2Bmw+iI{zTf?k=R=HK6KD9pe*+?^D
zxZrsa(uk<`tPp8JRC`*0G$5)y$wwLw)gI>|O^0faa*>8ZwTC%Kv!U99Y^2dp?S2Sp
zGE}>lg)|tdb!H;Xg=%**kjBDr*>EQvX)M&@?KGsRQ0-PK(om>&GX-fRRJ)OkG!d#@
zPeK|9)vg7R=0UZq0i<zI?MfojG^lnt0cjXiyA+Q!3#wg=LmCCuF8EPRf=%_jM4ANE
z&Iv5n?W~0~25Rk$4`~WiI~|KO1gf2iL7D;8PDUe*fNCcYX#!L`?nN2^)sA_Q_P=UJ
zJxJSMwIfAHyI-}#g=o|6SM^W<(%x6CBOht&tJa=}wDVOvn2WUWRXdP_wC`1G%SPJv
zs_hRU?RwSrWg%^P)mk%=_PlC)Gmy5tYJ1X=cD!o4(=bIhdsiybepib-Q;@d1YCDoK
zsN41=4CuBkh>5yw4Pb(9TM{u|x6KI{r`x7@^y{`U4yA4_eiXWGkZ9?)UZ77kTm5zG
zER5BQYke4_+nQL6)@^kRqHe3A(W~1^#3<cXc+sQV@+dTQYxba9w`FFGI*8T?7s!9g
z@8w_RSMr&>FK^0A^0b=5Ho2=gRAuz||2`Z>xz+ddypDNR%RH@No{VH3S2K@BFb{__
z4~8-KhcfquFr9;$yH(7cLCo!e%&k|Ln**2|{h90i)EQ3w_1F6H<<&mSmEO$dUd*MQ
z%*9IPLJ#JA1#_-DbGDp0(~UV@#+)i;PIhHZbYYH{Fvp6SqeW3}`X4<~$d`u;m_zwY
zM;_Cj%N)#M4rDWJA!dITvoDir&0zMXGkemQ-Kos36lP~Kvm=Sw9#q&a*cRZ+t%=N*
z1ZHzQvnh_*=x16avq3QHEoPmMSsTl&iD6bpGpmqU>19?#G0Qznvq`vNnY*R&e>Vqp
zJNVgex;um-w-G;Gc9>(mF25~mLH<krU8c)#<<~N(ZUbM+82MD1^1k?wyd_@BE8=^3
zPJAOzh(F0g;)UEV9?M;#Q*IGA<a%*Qt`ukF7vh-wOtj07MXUU+*dc!{HpzFzTG=F)
z%Z1`|IahotXNeDGgIFxbi}z){ct?&9zm!!$@rLXtX3I)3LzaojvPg`TIignGC|WJs
z<94}<>L?3qDGO>S^G8zVRa54Upv)OgnLUg$G?X%H2xaDA%8V+?^g)zq11VEqp-dS-
zncSZ;sUKyqFJ+()WnyoS`q6|dp%-1m_oR%gr1bZologbsJEc`l>FY)rTSggEN*Udi
zQhipd^p<cIQ+kRhiwY?V3n&ZnDf9Cv^KvP3b3ATaeP`KpksYE8Wl?5jQf6jQW~5W5
zr%|S*Ql_R*rX*7)Cs8H^DT4vZKq6&g0%bxxWqcfEoS)J!DW#wkmP*@Y`RKwIOBowO
z852zzjg;!6QKdJEGRi~gF)2;Ar9J}lWhOm>{7wEveFQ#Nk0E#DHF-gvQXhf`<Q}<A
zwy4LEWpau9ME*`alDsE>B^Swg>ak>+oG3@jk#dMn4v@WMxhzr7Cz)zTTvG?0B6T1F
zla66v(kTo~I)s5qXE61HLQXn?fk_82FzNgSCLO=Pq|+Ceboc_3&R$^B(F;sEd4Wj>
zFEHuc1tuN4zzlK*I1@RiCou7xah!fm$tgH3P9JA1XAEaFCvti@qc}a3Xnyq4_NwPS
H#Pa_F+p7tV

diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 4606cb87..65e949cf 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -156,6 +156,19 @@ class Ppi(models.Model):
     def __str__(self):
         return '{} PPI, PDB:{}'.format(self.symmetry.description, self.pdb_id or 'unknown')
 
+    def get_ppi_complexes(self):
+        """
+        return all ppi complexes belonging to this ppi
+        """
+        return PpiComplex.objects.filter(ppi=self)
+
+    def get_ppi_bound_complexes(self):
+        """
+        return bound ppi complexes belonging to this ppi
+        """
+        #this is the less efficient query ever seen, FIXME
+        return PpiComplex.objects.filter(ppi=self, complex__in=ProteinDomainBoundComplex.objects.all())
+
 class PpiComplex(models.Model):
     ppi = models.ForeignKey(Ppi)
     complex = models.ForeignKey(ProteinDomainComplex)
@@ -281,11 +294,14 @@ class TestActivityDescription(models.Model):
     cell_line = models.ForeignKey(CellLine)
 
     def get_complexes(self):
-        return None
-        # if test_modulation_type is Binding, return all bound complexes for the Ppi
-        # if test_modulation_type is Inhibition, return all Ppi complexes
-        # if test_modulation_type is Stabilization, return all bound complexes for the Ppi
-        # this should be added to the Ppi class as well
+        """
+        get the complexes tested for this PPI
+        depends on the modulation type
+        """
+        if self.test_modulation_type=='I':
+            return self.ppi.get_ppi_complexes()
+        else:
+            return self.ppi.get_ppi_bound_complexes()
 
 class CompoundActivityResult(models.Model):
     MODULATION_TYPES = (
@@ -364,9 +380,11 @@ class CmpdAction(models.Model):
         unique_together = (('ppi', 'compound', 'activation_mode', 'pdb_id'),)
 
     def get_complexes(self):
-        return None
-        # return all bound complexes for the Ppi
-        # this should be added to the Ppi class as well
+        """
+        get the complexes involved in the compound action
+        which are always the bound complexes
+        """
+        return ppi.get_ppi_bound_complexes()
 
 class RefCompoundBiblio(models.Model):
     compound = models.ForeignKey(Compound)  
-- 
GitLab