diff --git a/ippisite/db.sqlite3 b/ippisite/db.sqlite3 index d0f0db2af8cd80bce56b7148c24a74b09675dec6..585c05bac9b5bb713a7f404b36981aaa02f2ba17 100644 Binary files a/ippisite/db.sqlite3 and b/ippisite/db.sqlite3 differ diff --git a/ippisite/ippidb/forms.py b/ippisite/ippidb/forms.py index d7364dac8dd8d664a3bbccc54bd3cce6c813bd9d..d7ef84c1be94100b0da9117d110f0979cbdfceb5 100644 --- a/ippisite/ippidb/forms.py +++ b/ippisite/ippidb/forms.py @@ -1,7 +1,7 @@ from django.forms import ModelForm from django import forms from django.db import models -from .models import Bibliography, Protein, ProteinDomainComplex, Ppi +from .models import Bibliography, Protein, ProteinDomainComplex, Ppi, PpiComplex class IdForm(forms.Form): id = forms.CharField(label="",max_length=100, widget=forms.TextInput(attrs={'placeholder': 'PubMed ID / DOI / Patent ID'})) @@ -24,8 +24,12 @@ class ProteinDomainComplexForm(ModelForm): model = ProteinDomainComplex fields = ['protein', 'domain', 'ppc_copy_nb'] - class PpiForm(ModelForm): class Meta: model = Ppi - fields = ['complex', 'cc_nb', 'pdb_id', 'symmetry'] + fields = ['pdb_id', 'symmetry'] + +class PpiComplexForm(ModelForm): + class Meta: + model = PpiComplex + fields = ['complex', 'cc_nb'] diff --git a/ippisite/ippidb/migrations/0010_auto_20170518_1142.py b/ippisite/ippidb/migrations/0010_auto_20170518_1142.py new file mode 100644 index 0000000000000000000000000000000000000000..520ae2dce8e60f030c0fe11f1d218dbad969ca5f --- /dev/null +++ b/ippisite/ippidb/migrations/0010_auto_20170518_1142.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2017-05-18 11:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0009_auto_20170517_2020'), + ] + + operations = [ + migrations.CreateModel( + name='PpiComplex', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cc_nb', models.IntegerField(default=1, verbose_name='Number of copies of the complex in the PPI')), + ('complex', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.ProteinDomainComplex')), + ], + options={ + 'verbose_name_plural': 'Ppi complexes', + }, + ), + migrations.RemoveField( + model_name='ppi', + name='cc_nb', + ), + migrations.RemoveField( + model_name='ppi', + name='complex', + ), + migrations.RemoveField( + model_name='ppi', + name='ppi_id', + ), + migrations.RemoveField( + model_name='testactivitydescription', + name='complex', + ), + migrations.AlterField( + model_name='compoundactivityresult', + name='activity_type', + field=models.CharField(choices=[('pIC50', 'pIC50 (half maximal inhibitory concentration, -log10)'), ('pEC50', 'pEC50 (half maximal effective concentration, -log10)'), ('pKd', 'pKd (dissociation constant, -log10)'), ('pKi', 'pKi (inhibition constant, -log10)')], max_length=5, verbose_name='Activity type'), + ), + migrations.AlterUniqueTogether( + name='cmpdaction', + unique_together=set([('compound', 'activation_mode', 'pdb_id')]), + ), + migrations.RemoveField( + model_name='cmpdaction', + name='complex', + ), + migrations.AlterUniqueTogether( + name='cmpdaction', + unique_together=set([('ppi', 'compound', 'activation_mode', 'pdb_id')]), + ), + migrations.DeleteModel( + name='ActivityType', + ), + migrations.AddField( + model_name='ppicomplex', + name='ppi', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Ppi'), + ), + ] diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index 226227f7cb44c4d7d4afaa21f5b6eb89b684a87f..50288a93986113f872b57728b47c61ec364e5ebe 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -150,12 +150,17 @@ class Symmetry(models.Model): return '{} ({})'.format(self.code, self.description) class Ppi(models.Model): - ppi_id = models.IntegerField('PPI identifier') - complex = models.ForeignKey(ProteinDomainComplex) - cc_nb = models.IntegerField('Number of copies of the complex in the PPI', default=1) pdb_id = models.CharField('PDB ID', max_length=4) symmetry = models.ForeignKey(Symmetry) +class PpiComplex(models.Model): + ppi = models.ForeignKey(Ppi) + complex = models.ForeignKey(ProteinDomainComplex) + cc_nb = models.IntegerField('Number of copies of the complex in the PPI', default=1) + + class Meta: + verbose_name_plural = "Ppi complexes" + class Disease(models.Model): ppi = models.ForeignKey(Ppi) disease_name = models.CharField('Disease', max_length=30) # is there any database/nomenclature for diseases? @@ -261,7 +266,6 @@ class TestActivityDescription(models.Model): ('I', 'Inhibition'), ('S', 'Stabilization') ) - complex = models.ForeignKey(ProteinDomainBoundComplex) biblio = models.ForeignKey(Bibliography) ppi = models.ForeignKey(Ppi, blank=True, null=True) test_name = models.CharField('Test name', max_length=100) @@ -270,8 +274,12 @@ class TestActivityDescription(models.Model): nb_active_compounds = models.IntegerField('Total number of active compounds') cell_line = models.ForeignKey(CellLine) -class ActivityType(models.Model): - name = models.CharField('Name', max_length=50, unique=True) + 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 class CompoundActivityResult(models.Model): MODULATION_TYPES = ( @@ -279,9 +287,15 @@ class CompoundActivityResult(models.Model): ('I', 'Inhibition'), ('S', 'Stabilization') ) + ACTIVITY_TYPES = ( + ('pIC50','pIC50 (half maximal inhibitory concentration, -log10)'), + ('pEC50','pEC50 (half maximal effective concentration, -log10)'), + ('pKd','pKd (dissociation constant, -log10)'), + ('pKi','pKi (inhibition constant, -log10)'), + ) compound = models.ForeignKey(Compound) test_activity_description = models.ForeignKey(TestActivityDescription) - activity_type = models.ForeignKey(ActivityType) + activity_type = models.CharField('Activity type', max_length=5, choices=ACTIVITY_TYPES) activity = models.DecimalField('Activity', max_digits=12, decimal_places=10) modulation_type = models.CharField('Modulation type', max_length=1, choices=MODULATION_TYPES) @@ -334,7 +348,6 @@ class CmpdAction(models.Model): ('O', 'Orthosteric'), ('A', 'Allosteric') ) - complex = models.ForeignKey(ProteinDomainBoundComplex) compound = models.ForeignKey(Compound) activation_mode = models.CharField('Activation mode', max_length=1, choices=ACTIVATION_MODES) ppi = models.ForeignKey(Ppi) @@ -342,7 +355,12 @@ class CmpdAction(models.Model): nb_copy_compounds = models.IntegerField('Number of copies for the compound') class Meta: - unique_together = (('complex', 'compound', 'pdb_id'),) + 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 class RefCompoundBiblio(models.Model): compound = models.ForeignKey(Compound)