diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 812cfe615eee8823129b9a9251414ce578c3e2e3..d12312112da50a2cd491bc44a543ef19e56e5e38 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,6 +27,8 @@ deploy-webserver: - mkdir -p ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config script: + - pwd + - ls - yum install -y epel-release wget - yum install -y gcc - wget https://centos7.iuscommunity.org/ius-release.rpm diff --git a/ansible/deploy.yaml b/ansible/deploy.yaml index 94a646ad6461fcfbe0c1dbd86119c9d98a1d9855..e61a3abd3935678578876b86695826efcd7b008e 100644 --- a/ansible/deploy.yaml +++ b/ansible/deploy.yaml @@ -64,23 +64,27 @@ command: service postgresql initdb args: creates: /var/lib/pgsql/data/postgresql.conf - - name: Start PostgreSQL and enable at boot - service: name=postgresql - enabled=yes - state=started - name: Ensure PostgreSQL is listening on all localhost lineinfile: dest=/var/lib/pgsql/data/postgresql.conf regexp='^#?listen_addresses\s*=' line="listen_addresses = '*'" state=present - - lineinfile: dest=/var/lib/pgsql/data/pg_hba.conf - regexp='host\s+all\s+all\s+127.0.0.1/32\s+md5' - line='host all all 127.0.0.1/32 md5' - insertbefore=BOF + - name: copy pg_hba.conf file + copy: + src: pg_hba.conf + dest: /var/lib/pgsql/data/pg_hba.conf + owner: postgres + group: postgres - name: restart postgresql service systemd: state=restarted name=postgresql enabled=yes - - postgresql_user: + - name: create db in postgresql + become_user: "postgres" + postgresql_db: + name: "{{ dbname }}" + owner: "{{ dbuser }}" + - name: create db user become_user: "postgres" + postgresql_user: name: "{{ dbuser }}" password: "{{ dbpassword }}" role_attr_flags: CREATEDB,NOSUPERUSER diff --git a/ansible/pg_hba.conf b/ansible/pg_hba.conf new file mode 100644 index 0000000000000000000000000000000000000000..687ac4d2f8d31ccaada17309eb0bebd5e6366ef1 --- /dev/null +++ b/ansible/pg_hba.conf @@ -0,0 +1,4 @@ +# iPPIDB PostgreSQL Client Authentication Configuration File +# DO NOT EDIT THIS FILE, IT IS AUTOMATICALLY DEPLOYED FROM ANSIBLE +local all all peer +host all all ::1/128 md5 \ No newline at end of file diff --git a/ippisite/db.sqlite3.REMOVED.git-id b/ippisite/db.sqlite3.REMOVED.git-id index 3aa44d8e1381a4426d9846db700342d66385fc61..5e73a6d903ca43ff367e62ae4a49ef63a2df33db 100644 --- a/ippisite/db.sqlite3.REMOVED.git-id +++ b/ippisite/db.sqlite3.REMOVED.git-id @@ -1 +1 @@ -9444e1693d0cd7fdbabce38112ae5142691472b9 \ No newline at end of file +a95c9b99cc69a1cae8a8fa13dfa234ef88d45f4e \ No newline at end of file diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py index e06733ba84aaf60b0b4759589dc92216641f5431..9985399150f5309a6d2606d01c1ca6343d03f637 100644 --- a/ippisite/ippidb/management/commands/import_v1_data.py +++ b/ippisite/ippidb/management/commands/import_v1_data.py @@ -503,7 +503,7 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, cpr.tolerated = row[2] == 'Y' cpr.auc = row[3] cpr.clearance = row[4] - cpr.cmax = row[5] + cpr.c_max = row[5] cpr.oral_bioavailability = row[6] cpr.t_demi = row[7] cpr.t_max = row[8] @@ -538,7 +538,7 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, m.dvpmt_phase = item.data['PHASE'] m.db_import_date = timezone.now() m.save() - for activity_class_name in item.data['ACTIV_CLASS'].split(','): + for activity_class_name in item.data['ACTIV_CLASS'].split('\n'): activity_class, created = MDDRActivityClass.objects.get_or_create( name=activity_class_name) m.activity_classes.add(activity_class) diff --git a/ippisite/ippidb/migrations/0001_squashed_0035_auto_20180725_1347.py b/ippisite/ippidb/migrations/0001_squashed_0035_auto_20180725_1347.py new file mode 100644 index 0000000000000000000000000000000000000000..c088946f1035b6daf47ebba692790edb7fc8d1ac --- /dev/null +++ b/ippisite/ippidb/migrations/0001_squashed_0035_auto_20180725_1347.py @@ -0,0 +1,465 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-25 14:00 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + replaces = [('ippidb', '0001_initial'), ('ippidb', '0002_auto_20170221_1606'), ('ippidb', '0003_auto_20170313_1948'), ('ippidb', '0004_auto_20170314_1449'), ('ippidb', '0005_auto_20170327_1301'), ('ippidb', '0006_auto_20170327_1439'), ('ippidb', '0007_auto_20170328_2045'), ('ippidb', '0008_auto_20170329_1441'), ('ippidb', '0009_auto_20170517_2020'), ('ippidb', '0010_auto_20170518_1142'), ('ippidb', '0011_auto_20170518_1404'), ('ippidb', '0012_auto_20170518_1913'), ('ippidb', '0013_auto_20170518_1943'), ('ippidb', '0014_auto_20170519_1243'), ('ippidb', '0015_auto_20170519_1442'), ('ippidb', '0016_auto_20170519_1453'), ('ippidb', '0017_auto_20170519_1500'), ('ippidb', '0018_auto_20170522_1501'), ('ippidb', '0019_auto_20170522_1931'), ('ippidb', '0020_auto_20170522_1945'), ('ippidb', '0021_auto_20170522_1949'), ('ippidb', '0022_auto_20170523_1311'), ('ippidb', '0023_auto_20170523_1858'), ('ippidb', '0024_auto_20170523_2000'), ('ippidb', '0025_auto_20171110_1046'), ('ippidb', '0026_auto_20171110_1426'), ('ippidb', '0027_auto_20180307_1327'), ('ippidb', '0028_auto_20180307_1405'), ('ippidb', '0029_auto_20180308_1935'), ('ippidb', '0030_testpkdescription_concentration'), ('ippidb', '0031_compoundactivityresult_inhibition_percentage'), ('ippidb', '0032_lellebiplotdata'), ('ippidb', '0033_auto_20180502_1500'), ('ippidb', '0034_auto_20180503_2110'), ('ippidb', '0035_auto_20180725_1347')] + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Bibliography', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('source', models.CharField(choices=[('PM', 'PubMed ID'), ('PT', 'Patent'), ('DO', 'DOI ID')], default='PM', max_length=2, verbose_name='Bibliographic type')), + ('id_source', models.CharField(max_length=25, verbose_name='Bibliographic ID')), + ('title', models.CharField(max_length=300, verbose_name='Title')), + ('journal_name', models.CharField(max_length=50, null=True, verbose_name='Journal name')), + ('authors_list', models.CharField(max_length=500, verbose_name='Authors list')), + ('biblio_year', models.PositiveSmallIntegerField(verbose_name='Year')), + ('cytotox', models.BooleanField(default=False, verbose_name='Cytotoxicity data')), + ('in_silico', models.BooleanField(default=False, verbose_name='in silico study')), + ('in_vitro', models.BooleanField(default=False, verbose_name='in vitro study')), + ('in_vivo', models.BooleanField(default=False, verbose_name='in vivo study')), + ('in_cellulo', models.BooleanField(default=False, verbose_name='in cellulo study')), + ('pharmacokinetic', models.BooleanField(default=False, verbose_name='pharmacokinetic study')), + ('xray', models.BooleanField(default=False, verbose_name='X-Ray data')), + ], + options={ + 'verbose_name_plural': 'bibliographies', + }, + ), + migrations.CreateModel( + name='CellLine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='Name')), + ], + ), + migrations.CreateModel( + name='Compound', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('canonical_smile', models.CharField(max_length=500, unique=True, verbose_name='Canonical Smile')), + ('is_macrocycle', models.BooleanField(verbose_name='Contains one or more macrocycles')), + ('aromatic_ratio', models.DecimalField(decimal_places=2, max_digits=3, verbose_name='Aromatic ratio')), + ('balaban_index', models.DecimalField(decimal_places=2, max_digits=3, verbose_name='Balaban index')), + ('fsp3', models.DecimalField(decimal_places=2, max_digits=3, verbose_name='Fsp3')), + ('gc_molar_refractivity', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='GC Molar Refractivity')), + ('log_d', models.DecimalField(decimal_places=2, max_digits=4, verbose_name='LogD (Partition coefficient octanol-1/water, with pKa information)')), + ('a_log_p', models.DecimalField(decimal_places=2, max_digits=4, verbose_name='ALogP (Partition coefficient octanol-1/water)')), + ('mean_atom_vol_vdw', models.DecimalField(decimal_places=2, max_digits=4, verbose_name='Mean atom volume computed with VdW radii')), + ('molecular_weight', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='Molecular weight')), + ('nb_acceptor_h', models.IntegerField(verbose_name='Number of hydrogen bond acceptors')), + ('nb_aliphatic_amines', models.IntegerField(verbose_name='Number of aliphatics amines')), + ('nb_aromatic_bonds', models.IntegerField(verbose_name='Number of aromatic bonds')), + ('nb_aromatic_ether', models.IntegerField(verbose_name='Number of aromatic ethers')), + ('nb_aromatic_sssr', models.IntegerField(verbose_name='Number of aromatic Smallest Set of System Rings (SSSR)')), + ('nb_atom', models.IntegerField(verbose_name='Number of atoms')), + ('nb_atom_non_h', models.IntegerField(verbose_name='Number of non hydrogen atoms')), + ('nb_benzene_like_rings', models.IntegerField(verbose_name='Number of benzene-like rings')), + ('nb_bonds', models.IntegerField(verbose_name='Number of bonds')), + ('nb_bonds_non_h', models.IntegerField(verbose_name='Number of bonds not involving a hydrogen')), + ('nb_br', models.IntegerField(verbose_name='Number of Bromine atoms')), + ('nb_c', models.IntegerField(verbose_name='Number of Carbon atoms')), + ('nb_chiral_centers', models.IntegerField(verbose_name='Number of chiral centers')), + ('nb_circuits', models.IntegerField(verbose_name='Number of circuits')), + ('nb_cl', models.IntegerField(verbose_name='Number of Chlorine atoms')), + ('nb_csp2', models.IntegerField(verbose_name='Number of sp2-hybridized carbon atoms')), + ('nb_csp3', models.IntegerField(verbose_name='Number of sp3-hybridized carbon atoms')), + ('nb_donor_h', models.IntegerField(verbose_name='Number of hydrogen bond donors')), + ('nb_double_bonds', models.IntegerField(verbose_name='Number of double bonds')), + ('nb_f', models.IntegerField(verbose_name='Number of fluorine atoms')), + ('nb_i', models.IntegerField(verbose_name='Number of iodine atoms')), + ('nb_multiple_bonds', models.IntegerField(verbose_name='Number of multiple bonds')), + ('nb_n', models.IntegerField(verbose_name='Number of nitrogen atoms')), + ('nb_o', models.IntegerField(verbose_name='Number of oxygen atoms')), + ('nb_rings', models.IntegerField(verbose_name='Number of rings')), + ('nb_rotatable_bonds', models.IntegerField(verbose_name='Number of rotatable bonds')), + ('randic_index', models.DecimalField(decimal_places=2, max_digits=4, verbose_name='Randic index')), + ('rdf070m', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='RDF070m, radial distribution function weighted by the atomic masses at 7Å')), + ('rotatable_bond_fraction', models.DecimalField(decimal_places=2, max_digits=3, verbose_name='Fraction of rotatable bonds')), + ('sum_atom_polar', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='Sum of atomic polarizabilities')), + ('sum_atom_vol_vdw', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='Sum of atom volumes computed with VdW radii')), + ('tpsa', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='Topological Polar Surface Area (TPSA)')), + ('ui', models.DecimalField(decimal_places=2, max_digits=4, verbose_name='Unsaturation index')), + ('wiener_index', models.IntegerField(verbose_name='Wiener index')), + ('common_name', models.CharField(blank=True, max_length=20, null=True, unique=True, verbose_name='Common name')), + ('pubchem_id', models.CharField(blank=True, max_length=10, null=True, verbose_name='Pubchem ID')), + ('chemspider_id', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='Chemspider ID')), + ('chembl_id', models.CharField(blank=True, max_length=30, null=True, verbose_name='Chembl ID')), + ('iupac_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='IUPAC name')), + ], + ), + migrations.CreateModel( + name='CompoundAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('activation_mode', models.CharField(choices=[('O', 'Orthosteric'), ('A', 'Allosteric'), ('U', 'Unspecified')], max_length=1, verbose_name='Activation mode')), + ('pdb_id', models.CharField(blank=True, max_length=4, null=True, verbose_name='PDB ID')), + ('nb_copy_compounds', models.IntegerField(verbose_name='Number of copies for the compound')), + ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Compound')), + ], + ), + migrations.CreateModel( + name='CompoundActivityResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('activity_type', 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')), + ('activity', models.DecimalField(decimal_places=10, max_digits=12, verbose_name='Activity')), + ('inhibition_percentage', models.DecimalField(decimal_places=0, max_digits=3, null=True, verbose_name='Inhibition percentage')), + ('modulation_type', models.CharField(choices=[('B', 'Binding'), ('I', 'Inhibition'), ('S', 'Stabilization')], max_length=1, verbose_name='Modulation type')), + ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Compound')), + ], + ), + migrations.CreateModel( + name='CompoundCytotoxicityResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('toxicity', models.BooleanField(default=False, verbose_name='Toxicity')), + ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Compound')), + ], + ), + migrations.CreateModel( + name='CompoundPKResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tolerated', models.NullBooleanField(verbose_name='Tolerated')), + ('auc', models.IntegerField(blank=True, null=True, verbose_name='Area under curve (ng.mL-1.hr)')), + ('clearance', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='Clearance (mL/hr)')), + ('c_max', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='Maximal concentration (ng/mL)')), + ('oral_bioavailability', models.IntegerField(blank=True, null=True, verbose_name='Oral Bioavailability (%F)')), + ('t_demi', models.IntegerField(blank=True, null=True, verbose_name='t½')), + ('t_max', models.IntegerField(blank=True, null=True, verbose_name='tmax')), + ('voldistribution', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='Volume distribution (Vd)')), + ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Compound')), + ], + ), + migrations.CreateModel( + name='Disease', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='Disease')), + ], + ), + migrations.CreateModel( + name='Domain', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pfam_acc', models.CharField(max_length=10, unique=True, verbose_name='Pfam Accession')), + ('pfam_id', models.CharField(max_length=20, verbose_name='Pfam Family Identifier')), + ('pfam_description', models.CharField(max_length=100, verbose_name='Pfam Description')), + ('domain_family', models.CharField(max_length=25, verbose_name='Domain family')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LeLleBiplotData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('le_lle_biplot_data', models.CharField(blank=True, max_length=150000, null=True, verbose_name='LE-LLE biplot JSON data')), + ], + ), + migrations.CreateModel( + name='MDDRActivityClass', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True, verbose_name='Activity Class')), + ], + options={ + 'verbose_name_plural': 'MDDR activity classes', + }, + ), + migrations.CreateModel( + name='MDDRCompoundImport', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mddr_name', models.CharField(max_length=40, verbose_name='MDDR name')), + ('dvpmt_phase', models.CharField(choices=[('Biological Testing', ''), ('Preclinical', ''), ('Phase III', ''), ('Phase II', ''), ('Phase I/II', ''), ('Phase I', ''), ('Launched', ''), ('Pre-Registered', ''), ('Not Applicable', ''), ('Discontinued', ''), ('Clinical', ''), ('Withdrawn', ''), ('Registered', ''), ('Not Determined', ''), ('Phase II/III', ''), ('IND Filed', '')], max_length=20, verbose_name='Development phase')), + ('canonical_smile', models.CharField(blank=True, max_length=500, null=True, verbose_name='Canonical Smile')), + ('db_import_date', models.DateTimeField(verbose_name='MDDR release year/month')), + ('activity_classes', models.ManyToManyField(to='ippidb.MDDRActivityClass')), + ], + options={ + 'verbose_name_plural': 'MDDR compound imports', + }, + ), + migrations.CreateModel( + name='MDDRSimilarity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('canonical_smile_ippidb', models.CharField(blank=True, max_length=500, null=True, unique=True, verbose_name='Canonical Smile for IPPIDB compound')), + ('canonical_smile_mddr', models.CharField(blank=True, max_length=500, null=True, unique=True, verbose_name='Canonical Smile for MDDR Compound')), + ('tanimoto', models.DecimalField(decimal_places=5, max_digits=6, verbose_name='Tanimoto')), + ], + options={ + 'verbose_name_plural': 'MDDR similarities', + }, + ), + migrations.CreateModel( + name='MolecularFunction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('go_id', models.CharField(max_length=10, unique=True, verbose_name='Gene Ontology ID')), + ('description', models.CharField(max_length=500, verbose_name='description')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PcaBiplotData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pca_biplot_data', models.CharField(blank=True, max_length=150000, null=True, verbose_name='PCA biplot JSON data')), + ], + ), + migrations.CreateModel( + name='Ppi', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pdb_id', models.CharField(max_length=4, null=True, verbose_name='PDB ID')), + ('pockets_nb', models.IntegerField(default=1, verbose_name='Total number of pockets in the complex')), + ('diseases', models.ManyToManyField(to='ippidb.Disease')), + ], + ), + 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')), + ], + options={ + 'verbose_name_plural': 'Ppi complexes', + }, + ), + migrations.CreateModel( + name='PpiFamily', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='Name')), + ], + options={ + 'verbose_name_plural': 'PPI Families', + }, + ), + migrations.CreateModel( + name='Protein', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uniprot_id', models.CharField(max_length=10, unique=True, verbose_name='Uniprot ID')), + ('recommended_name_long', models.CharField(max_length=75, verbose_name='Uniprot Recommended Name (long)')), + ('short_name', models.CharField(max_length=50, verbose_name='Short name')), + ('gene_name', models.CharField(max_length=30, unique=True, verbose_name='Gene name')), + ('entry_name', models.CharField(max_length=30, verbose_name='Entry name')), + ('molecular_functions', models.ManyToManyField(to='ippidb.MolecularFunction')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProteinDomainComplex', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ppc_copy_nb', models.IntegerField(verbose_name='Number of copies of the protein in the complex')), + ], + options={ + 'verbose_name_plural': 'complexes', + }, + ), + migrations.CreateModel( + name='RefCompoundBiblio', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('compound_name', models.CharField(max_length=50, verbose_name='Compound name in the publication')), + ('bibliography', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Bibliography')), + ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Compound')), + ], + ), + migrations.CreateModel( + name='Symmetry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=2, verbose_name='Symmetry code')), + ('description', models.CharField(max_length=300, verbose_name='Description')), + ], + options={ + 'verbose_name_plural': 'symmetries', + }, + ), + migrations.CreateModel( + name='Taxonomy', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('taxonomy_id', models.DecimalField(decimal_places=0, max_digits=9, unique=True, verbose_name='NCBI TaxID')), + ('name', models.CharField(max_length=200, verbose_name='Organism name')), + ], + options={ + 'verbose_name_plural': 'taxonomies', + }, + ), + migrations.CreateModel( + name='TestActivityDescription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('test_name', models.CharField(max_length=100, verbose_name='Test name')), + ('is_primary', models.BooleanField(verbose_name='Is primary')), + ('protein_bound_construct', models.CharField(blank=True, choices=[('F', 'Full length'), ('U', 'Unspecified')], max_length=5, null=True, verbose_name='Protein bound construct')), + ('test_type', models.CharField(choices=[('BIOCH', 'Biochemical assay'), ('CELL', 'Cellular assay')], max_length=5, verbose_name='Test type')), + ('test_modulation_type', models.CharField(choices=[('B', 'Binding'), ('I', 'Inhibition'), ('S', 'Stabilization')], max_length=1, verbose_name='Test modulation type')), + ('nb_active_compounds', models.IntegerField(verbose_name='Total number of active compounds')), + ('biblio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Bibliography')), + ('cell_line', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ippidb.CellLine')), + ('ppi', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ippidb.Ppi')), + ], + ), + migrations.CreateModel( + name='TestCytotoxDescription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('test_name', models.CharField(max_length=100, verbose_name='Cytotoxicity test name')), + ('compound_concentration', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='Compound concentration in μM')), + ('biblio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Bibliography')), + ('cell_line', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.CellLine')), + ], + ), + migrations.CreateModel( + name='TestPKDescription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('test_name', models.CharField(max_length=100, verbose_name='Pharmacokinetic test name')), + ('administration_mode', models.CharField(blank=True, choices=[('IV', ''), ('PO', ''), ('IP', ''), ('SL', 'SL')], max_length=2, null=True, verbose_name='Administration mode')), + ('concentration', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='Concentration in mg/l')), + ('dose', models.DecimalField(blank=True, decimal_places=4, max_digits=9, null=True, verbose_name='Dose in mg/kg')), + ('dose_interval', models.IntegerField(blank=True, null=True, verbose_name='Dose interval, in hours')), + ('biblio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Bibliography')), + ('organism', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Taxonomy')), + ], + ), + migrations.CreateModel( + name='ProteinDomainBoundComplex', + fields=[ + ('proteindomaincomplex_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ippidb.ProteinDomainComplex')), + ('ppp_copy_nb_per_p', models.IntegerField(verbose_name='Number of copies of the protein in the pocket')), + ], + options={ + 'verbose_name_plural': 'bound complexes', + }, + bases=('ippidb.proteindomaincomplex',), + ), + migrations.CreateModel( + name='ProteinDomainPartnerComplex', + fields=[ + ('proteindomaincomplex_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ippidb.ProteinDomainComplex')), + ], + options={ + 'verbose_name_plural': 'partner complexes', + }, + bases=('ippidb.proteindomaincomplex',), + ), + migrations.AddField( + model_name='proteindomaincomplex', + name='domain', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Domain'), + ), + migrations.AddField( + model_name='proteindomaincomplex', + name='protein', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Protein'), + ), + migrations.AddField( + model_name='protein', + name='organism', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Taxonomy'), + ), + migrations.AddField( + model_name='ppicomplex', + name='complex', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.ProteinDomainComplex'), + ), + migrations.AddField( + model_name='ppicomplex', + name='ppi', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Ppi'), + ), + migrations.AddField( + model_name='ppi', + name='family', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ippidb.PpiFamily'), + ), + migrations.AddField( + model_name='ppi', + name='symmetry', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Symmetry'), + ), + migrations.AlterUniqueTogether( + name='mddrsimilarity', + unique_together=set([('canonical_smile_ippidb', 'canonical_smile_mddr')]), + ), + migrations.AddField( + model_name='compoundpkresult', + name='test_pk_description', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.TestPKDescription'), + ), + migrations.AddField( + model_name='compoundcytotoxicityresult', + name='test_cytotoxicity_description', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.TestCytotoxDescription'), + ), + migrations.AddField( + model_name='compoundactivityresult', + name='test_activity_description', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.TestActivityDescription'), + ), + migrations.AddField( + model_name='compoundaction', + name='ppi', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.Ppi'), + ), + migrations.AddField( + model_name='compound', + name='mddr_compound', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ippidb.MDDRCompoundImport'), + ), + migrations.AddField( + model_name='testactivitydescription', + name='protein_domain_bound_complex', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ippidb.ProteinDomainBoundComplex'), + ), + migrations.AlterUniqueTogether( + name='refcompoundbiblio', + unique_together=set([('compound', 'bibliography')]), + ), + migrations.AlterUniqueTogether( + name='mddrcompoundimport', + unique_together=set([('mddr_name', 'dvpmt_phase', 'canonical_smile')]), + ), + migrations.AlterUniqueTogether( + name='compoundpkresult', + unique_together=set([('compound', 'test_pk_description')]), + ), + migrations.AlterUniqueTogether( + name='compoundcytotoxicityresult', + unique_together=set([('compound', 'test_cytotoxicity_description')]), + ), + migrations.AlterUniqueTogether( + name='compoundactivityresult', + unique_together=set([('compound', 'test_activity_description', 'activity_type')]), + ), + migrations.AlterUniqueTogether( + name='compoundaction', + unique_together=set([('ppi', 'compound', 'activation_mode', 'pdb_id')]), + ), + ] diff --git a/ippisite/ippidb/migrations/0002_auto_20180725_1805.py b/ippisite/ippidb/migrations/0002_auto_20180725_1805.py new file mode 100644 index 0000000000000000000000000000000000000000..40172f379a1619fb6c2c28df69072970a611f722 --- /dev/null +++ b/ippisite/ippidb/migrations/0002_auto_20180725_1805.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-25 18:05 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0001_squashed_0035_auto_20180725_1347'), + ] + + operations = [ + migrations.AlterField( + model_name='lellebiplotdata', + name='le_lle_biplot_data', + field=models.TextField(blank=True, null=True, verbose_name='LE-LLE biplot JSON data'), + ), + migrations.AlterField( + model_name='pcabiplotdata', + name='pca_biplot_data', + field=models.TextField(blank=True, null=True, verbose_name='PCA biplot JSON data'), + ), + ] diff --git a/ippisite/ippidb/migrations/0003_auto_20180726_1755.py b/ippisite/ippidb/migrations/0003_auto_20180726_1755.py new file mode 100644 index 0000000000000000000000000000000000000000..ae85563ae0c67989aefe28250d914d6c7c426167 --- /dev/null +++ b/ippisite/ippidb/migrations/0003_auto_20180726_1755.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-26 17:55 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0002_auto_20180725_1805'), + ] + + operations = [ + migrations.AlterField( + model_name='mddractivityclass', + name='name', + field=models.TextField(max_length=100, unique=True, verbose_name='Activity Class'), + ), + ] diff --git a/ippisite/ippidb/migrations/0004_auto_20180727_0656.py b/ippisite/ippidb/migrations/0004_auto_20180727_0656.py new file mode 100644 index 0000000000000000000000000000000000000000..98ce6d06722d8254968ef1f3322c7fb673fd39f6 --- /dev/null +++ b/ippisite/ippidb/migrations/0004_auto_20180727_0656.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-27 06:56 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0003_auto_20180726_1755'), + ] + + operations = [ + migrations.AlterField( + model_name='compound', + name='canonical_smile', + field=models.TextField(unique=True, verbose_name='Canonical Smile'), + ), + migrations.AlterField( + model_name='mddrcompoundimport', + name='canonical_smile', + field=models.TextField(blank=True, null=True, verbose_name='Canonical Smile'), + ), + migrations.AlterField( + model_name='mddrsimilarity', + name='canonical_smile_ippidb', + field=models.TextField(blank=True, null=True, unique=True, verbose_name='Canonical Smile for IPPIDB compound'), + ), + migrations.AlterField( + model_name='mddrsimilarity', + name='canonical_smile_mddr', + field=models.TextField(blank=True, null=True, unique=True, verbose_name='Canonical Smile for MDDR Compound'), + ), + ] diff --git a/ippisite/ippidb/migrations/0005_auto_20180727_0717.py b/ippisite/ippidb/migrations/0005_auto_20180727_0717.py new file mode 100644 index 0000000000000000000000000000000000000000..6cf348264c3349b70c99768cee436b87eed13b26 --- /dev/null +++ b/ippisite/ippidb/migrations/0005_auto_20180727_0717.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-27 07:17 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0004_auto_20180727_0656'), + ] + + operations = [ + migrations.AlterField( + model_name='mddrcompoundimport', + name='dvpmt_phase', + field=models.CharField(choices=[('Biological Testing', ''), ('Preclinical', ''), ('Phase III', ''), ('Phase II', ''), ('Phase I/II', ''), ('Phase I', ''), ('Launched', ''), ('Pre-Registered', ''), ('Not Applicable', ''), ('Discontinued', ''), ('Clinical', ''), ('Withdrawn', ''), ('Registered', ''), ('Not Determined', ''), ('Phase II/III', ''), ('IND Filed', ''), ('Phase 0', ''), ('Suspended', '')], max_length=20, verbose_name='Development phase'), + ), + migrations.AlterField( + model_name='mddrcompoundimport', + name='mddr_name', + field=models.TextField(verbose_name='MDDR name'), + ), + ] diff --git a/ippisite/ippidb/migrations/0006_auto_20180727_0816.py b/ippisite/ippidb/migrations/0006_auto_20180727_0816.py new file mode 100644 index 0000000000000000000000000000000000000000..0bc83482978888950e6f8ededc058a4677aa91d5 --- /dev/null +++ b/ippisite/ippidb/migrations/0006_auto_20180727_0816.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-27 08:16 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0005_auto_20180727_0717'), + ] + + operations = [ + migrations.AlterField( + model_name='bibliography', + name='journal_name', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Journal name'), + ), + ] diff --git a/ippisite/ippidb/migrations/0007_auto_20180727_0822.py b/ippisite/ippidb/migrations/0007_auto_20180727_0822.py new file mode 100644 index 0000000000000000000000000000000000000000..05ba1839dd86947cb27ed3fea7e0908265924c35 --- /dev/null +++ b/ippisite/ippidb/migrations/0007_auto_20180727_0822.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-27 08:22 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0006_auto_20180727_0816'), + ] + + operations = [ + migrations.AlterField( + model_name='compoundactivityresult', + name='inhibition_percentage', + field=models.DecimalField(blank=True, decimal_places=0, max_digits=3, null=True, verbose_name='Inhibition percentage'), + ), + ] diff --git a/ippisite/ippidb/migrations/0008_auto_20180727_0845.py b/ippisite/ippidb/migrations/0008_auto_20180727_0845.py new file mode 100644 index 0000000000000000000000000000000000000000..b089228183ec95360e15013a047ab4f471e4b70b --- /dev/null +++ b/ippisite/ippidb/migrations/0008_auto_20180727_0845.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-27 08:45 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0007_auto_20180727_0822'), + ] + + operations = [ + migrations.AlterField( + model_name='ppi', + name='family', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ippidb.PpiFamily'), + ), + migrations.AlterField( + model_name='ppi', + name='pdb_id', + field=models.CharField(blank=True, max_length=4, null=True, verbose_name='PDB ID'), + ), + ] diff --git a/ippisite/ippidb/migrations/0035_auto_20180725_1347.py b/ippisite/ippidb/migrations/0035_auto_20180725_1347.py new file mode 100644 index 0000000000000000000000000000000000000000..f2f809c5e61db086086125508b95ce0d609dfeeb --- /dev/null +++ b/ippisite/ippidb/migrations/0035_auto_20180725_1347.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-07-25 13:47 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0034_auto_20180503_2110'), + ] + + operations = [ + migrations.RenameField( + model_name='compoundpkresult', + old_name='cmax', + new_name='c_max', + ), + ] diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index e0d3571ff40cd5ba622bb5f3051f1225df1dcdd4..6ccd9d0758b20fb0d5dae0b3bc7380e9742159e6 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -40,7 +40,7 @@ class Bibliography(AutoFillableModel): 'Bibliographic type', max_length=2, choices=SOURCES, default='PM') id_source = models.CharField('Bibliographic ID', max_length=25) title = models.CharField('Title', max_length=300) - journal_name = models.CharField('Journal name', max_length=50, null=True) + journal_name = models.CharField('Journal name', max_length=50, null=True, blank=True) authors_list = models.CharField('Authors list', max_length=500) biblio_year = models.PositiveSmallIntegerField('Year') cytotox = models.BooleanField('Cytotoxicity data', default=False) @@ -212,12 +212,12 @@ class PpiFamily(models.Model): class Ppi(models.Model): - pdb_id = models.CharField('PDB ID', max_length=4, null=True) + pdb_id = models.CharField('PDB ID', max_length=4, null=True, blank=True) pockets_nb = models.IntegerField( 'Total number of pockets in the complex', default=1) symmetry = models.ForeignKey(Symmetry, models.CASCADE) diseases = models.ManyToManyField(Disease) - family = models.ForeignKey(PpiFamily, models.CASCADE, null=True) + family = models.ForeignKey(PpiFamily, models.CASCADE, null=True, blank=True) def __str__(self): return '{} PPI, PDB:{}'.format(self.symmetry.description, self.pdb_id or 'unknown') @@ -264,8 +264,8 @@ class PpiComplex(models.Model): class Compound(models.Model): - canonical_smile = models.CharField( - 'Canonical Smile', unique=True, max_length=500) + canonical_smile = models.TextField( + 'Canonical Smile', unique=True) is_macrocycle = models.BooleanField('Contains one or more macrocycles') aromatic_ratio = models.DecimalField( 'Aromatic ratio', max_digits=3, decimal_places=2) @@ -497,17 +497,17 @@ class Compound(models.Model): class PcaBiplotData(models.Model): - pca_biplot_data = models.CharField( - 'PCA biplot JSON data', max_length=150000, blank=True, null=True) + pca_biplot_data = models.TextField( + 'PCA biplot JSON data', blank=True, null=True) class LeLleBiplotData(models.Model): - le_lle_biplot_data = models.CharField( - 'LE-LLE biplot JSON data', max_length=150000, blank=True, null=True) + le_lle_biplot_data = models.TextField( + 'LE-LLE biplot JSON data', blank=True, null=True) class MDDRActivityClass(models.Model): - name = models.CharField('Activity Class', max_length=100, unique=True) + name = models.TextField('Activity Class', max_length=100, unique=True) class Meta: verbose_name_plural = "MDDR activity classes" @@ -535,13 +535,15 @@ class MDDRCompoundImport(models.Model): ('Not Determined', ''), ('Phase II/III', ''), ('IND Filed', ''), + ('Phase 0', ''), + ('Suspended', ''), ) - mddr_name = models.CharField('MDDR name', max_length=40) + mddr_name = models.TextField('MDDR name') dvpmt_phase = models.CharField( 'Development phase', max_length=20, choices=MDDR_DEVELOPMENT_PHASES) - canonical_smile = models.CharField( - 'Canonical Smile', max_length=500, blank=True, null=True) + canonical_smile = models.TextField( + 'Canonical Smile', blank=True, null=True) # TODO index this table on canonical_smile db_import_date = models.DateTimeField('MDDR release year/month') activity_classes = models.ManyToManyField(MDDRActivityClass) @@ -558,10 +560,10 @@ class MDDRCompoundImport(models.Model): class MDDRSimilarity(models.Model): - canonical_smile_ippidb = models.CharField( - 'Canonical Smile for IPPIDB compound', max_length=500, unique=True, blank=True, null=True) - canonical_smile_mddr = models.CharField( - 'Canonical Smile for MDDR Compound', max_length=500, unique=True, blank=True, null=True) + canonical_smile_ippidb = models.TextField( + 'Canonical Smile for IPPIDB compound', unique=True, blank=True, null=True) + canonical_smile_mddr = models.TextField( + 'Canonical Smile for MDDR Compound', unique=True, blank=True, null=True) tanimoto = models.DecimalField('Tanimoto', max_digits=6, decimal_places=5) class Meta: @@ -644,7 +646,7 @@ class CompoundActivityResult(models.Model): activity = models.DecimalField( 'Activity', max_digits=12, decimal_places=10) inhibition_percentage = models.DecimalField( - 'Inhibition percentage', max_digits=3, decimal_places=0, null=True) + 'Inhibition percentage', max_digits=3, decimal_places=0, null=True, blank=True) modulation_type = models.CharField( 'Modulation type', max_length=1, choices=MODULATION_TYPES) @@ -708,7 +710,7 @@ class CompoundPKResult(models.Model): 'Area under curve (ng.mL-1.hr)', blank=True, null=True) clearance = models.DecimalField( 'Clearance (mL/hr)', max_digits=7, decimal_places=3, blank=True, null=True) - cmax = models.DecimalField( + c_max = models.DecimalField( 'Maximal concentration (ng/mL)', max_digits=7, decimal_places=3, blank=True, null=True) oral_bioavailability = models.IntegerField( 'Oral Bioavailability (%F)', blank=True, null=True) diff --git a/ippisite/ippisite/hub16_settings.py b/ippisite/ippisite/hub16_settings.py index def11d3dbfa05f1695e90c2648cf939a141f924c..f29c6ecb7b2f5ebe0eaa1d4a5e493b1fd3e3a2b3 100644 --- a/ippisite/ippisite/hub16_settings.py +++ b/ippisite/ippisite/hub16_settings.py @@ -90,14 +90,24 @@ WSGI_APPLICATION = 'ippisite.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases +#DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': os.path.join(BASE_DIR, 'hub16_db.sqlite3'), +# } +#} + DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'hub16_db.sqlite3'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'ippidb', + 'USER': 'ippidb', + 'PASSWORD': 'LeroyMerlin', + 'HOST': 'localhost', + 'PORT': '', } } - # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators diff --git a/ippisite/requirements.txt b/ippisite/requirements.txt index be3d39025d71ff2758fe82b9a21e9dc99e4fe16c..0d5e0638dd7211ab356b678c24c75d731c2e9bc5 100644 --- a/ippisite/requirements.txt +++ b/ippisite/requirements.txt @@ -14,3 +14,4 @@ django-allauth==0.36 sklearn scipy matplotlib +psycopg2 \ No newline at end of file