diff --git a/ippisite/db.sqlite3.REMOVED.git-id b/ippisite/db.sqlite3.REMOVED.git-id index 1e8b356813e3c25ccb49abc3c792bf6064131654..76a796217b3f4cfbd42d7bb04dbe57bd088b3bbc 100644 --- a/ippisite/db.sqlite3.REMOVED.git-id +++ b/ippisite/db.sqlite3.REMOVED.git-id @@ -1 +1 @@ -1068c5d524bfec4a3fbb0bbd2a3b88063451db93 \ No newline at end of file +996a2c5897e7d16bd61e296b0099825e1e96e664 \ 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 259d17564fc5a3625e9d12c220cfaa82513fd62d..e8213ad744af2cf2ab5f962948011f0f1bc0a2bd 100644 --- a/ippisite/ippidb/management/commands/import_v1_data.py +++ b/ippisite/ippidb/management/commands/import_v1_data.py @@ -6,7 +6,7 @@ import mysql.connector from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction, \ Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi, PpiComplex, Disease, \ - Compound, MDDRCompoundImport, MDDRActivityClass, TestActivityDescription, CellLine, RefCompoundBiblio + Compound, MDDRCompoundImport, MDDRActivityClass, TestActivityDescription, CellLine, RefCompoundBiblio, CompoundAction class MyConverter(mysql.connector.conversion.MySQLConverter): @@ -102,6 +102,8 @@ class Command(BaseCommand): conn = mysql.connector.connect( converter_class=MyConverter, host="localhost", user="root", password="ippidb", database="ippidb") cursor = conn.cursor() + cursor_aux = conn.cursor(buffered=True) + cursor_aux2 = conn.cursor(buffered=True) if options['bibliographies']: cursor.execute("""SELECT * FROM biblio""") rows = cursor.fetchall() @@ -234,8 +236,9 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, Disease.objects.all().delete() Ppi.objects.all().delete() PpiComplex.objects.all().delete() + CompoundAction.objects.all().delete() self.stdout.write( - self.style.SUCCESS('Successfully flushed protein domain complex, PPI, and disease tables')) + self.style.SUCCESS('Successfully flushed protein domain complex, PPI, compound actions, and disease tables')) ppi_ids_mapping = {} for row in rows: try: @@ -272,6 +275,32 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, ppi_complex.complex = c ppi_complex.cc_nb = 1 ppi_complex.save() + if row[3] is not None: + sql_ca_string = '''select distinct c.CanonicalSmile from cmpdAction as ca + inner join compound as c on ca.IDCompound=c.IDCompound where ca.IDComplexeBound='''\ + + str(row[3]) + cursor_aux.execute(sql_ca_string) + rows_aux = cursor_aux.fetchall() + for row_aux in rows_aux: + if row_aux is None: + self.stdout.write(sql_ca_string) + continue + canonical_smile = row_aux[0] + sql_bse_string = '''select CodePDB from bindingSiteEvidence where IDPPI=''' + str(ppi.id) + cursor_aux.execute(sql_bse_string) + row_aux2 = cursor_aux2.fetchone() + if row_aux2 is None: + pdb_id_ca = None + else: + pdb_id_ca = row_aux2[0] + c = Compound.objects.get(canonical_smile=canonical_smile) + ca = CompoundAction() + ca.compound = c + ca.ppi = ppi + ca.activation_mode = 'U' + ca.nb_copy_compounds = 1 + ca.pdb_id = pdb_id_ca + ca.save() except Exception as e: if options['stoponfail']: import traceback diff --git a/ippisite/ippidb/migrations/0025_auto_20171110_1046.py b/ippisite/ippidb/migrations/0025_auto_20171110_1046.py new file mode 100644 index 0000000000000000000000000000000000000000..a8726087da8c0b36c5b71e72f6f95bdd2dbe1089 --- /dev/null +++ b/ippisite/ippidb/migrations/0025_auto_20171110_1046.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-11-10 10:46 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0024_auto_20170523_2000'), + ] + + operations = [ + migrations.AlterField( + model_name='bibliography', + name='in_cellulo', + field=models.BooleanField(default=False, verbose_name='in cellulo study'), + ), + migrations.AlterField( + model_name='bibliography', + name='in_silico', + field=models.BooleanField(default=False, verbose_name='in silico study'), + ), + migrations.AlterField( + model_name='bibliography', + name='in_vitro', + field=models.BooleanField(default=False, verbose_name='in vitro study'), + ), + migrations.AlterField( + model_name='bibliography', + name='in_vivo', + field=models.BooleanField(default=False, verbose_name='in vivo study'), + ), + migrations.AlterField( + model_name='bibliography', + name='pharmacokinetic', + field=models.BooleanField(default=False, verbose_name='pharmacokinetic study'), + ), + migrations.AlterField( + model_name='bibliography', + name='source', + field=models.CharField(choices=[('PM', 'PubMed ID'), ('PT', 'Patent'), ('DO', 'DOI ID')], default='PM', max_length=2, verbose_name='Bibliographic type'), + ), + migrations.AlterField( + model_name='bibliography', + name='xray', + field=models.BooleanField(default=False, verbose_name='X-Ray data'), + ), + migrations.AlterField( + model_name='compoundaction', + name='activation_mode', + field=models.CharField(choices=[('O', 'Orthosteric'), ('A', 'Allosteric'), ('U', 'Unspecified')], max_length=1, verbose_name='Activation mode'), + ), + migrations.AlterField( + model_name='protein', + name='organism', + field=models.ForeignKey(default='Homo sapiens', on_delete=django.db.models.deletion.CASCADE, to='ippidb.Taxonomy'), + ), + ] diff --git a/ippisite/ippidb/migrations/0026_auto_20171110_1426.py b/ippisite/ippidb/migrations/0026_auto_20171110_1426.py new file mode 100644 index 0000000000000000000000000000000000000000..0dca58c57af03dd6d5061ddcfb8a7b7443cb686c --- /dev/null +++ b/ippisite/ippidb/migrations/0026_auto_20171110_1426.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-11-10 14:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0025_auto_20171110_1046'), + ] + + operations = [ + migrations.AlterField( + model_name='compoundaction', + name='pdb_id', + field=models.CharField(blank=True, max_length=4, null=True, verbose_name='PDB ID'), + ), + ] diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index 232e595e92ef3807ff99b21fa2cabed997f7de95..5e4c3d225e8da27831ddd30b070c7103291ec8f8 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -513,13 +513,14 @@ class CompoundPKResult(models.Model): class CompoundAction(models.Model): ACTIVATION_MODES = ( ('O', 'Orthosteric'), - ('A', 'Allosteric') + ('A', 'Allosteric'), + ('U', 'Unspecified') ) compound = models.ForeignKey(Compound) activation_mode = models.CharField( 'Activation mode', max_length=1, choices=ACTIVATION_MODES) ppi = models.ForeignKey(Ppi) - pdb_id = models.CharField('PDB ID', max_length=4) + pdb_id = models.CharField('PDB ID', max_length=4, blank=True, null=True) nb_copy_compounds = models.IntegerField( 'Number of copies for the compound') diff --git a/ippisite/ippidb/templates/compound_abstract.html b/ippisite/ippidb/templates/compound_abstract.html index a8094c2741faac61dc5108baf4e510c57c1eb6fb..82110001a00658878fafadbe3f30d18222c1425d 100644 --- a/ippisite/ippidb/templates/compound_abstract.html +++ b/ippisite/ippidb/templates/compound_abstract.html @@ -1,15 +1,6 @@ <div class="row m-2 border border-info bg-light"> - <div class="col-sm-3 bg-info"> - <div id="{{ compound.id }}_smilesdisplay" - data-widget="Kekule.ChemWidget.Viewer2D" data-auto-fit="true" - data-toolbar-evoke-modes="[0]" style="width: 200px; height: 200px;"> - </div> - <textarea rows="10" cols="50" id="{{ compound.id }}_smilesvalue" style="display:none;">{{ compound.canonical_smile }}</textarea> - <script> - $(window).on('load', function(){ - kekule_display('{{ compound.id }}_smilesvalue','{{ compound.id }}_smilesdisplay') - }); - </script> + <div class="col-sm-3 border-info d-flex justify-content-center align-content-center"> + <img src="https://pubchem.ncbi.nlm.nih.gov/image/imagefly.cgi?cid={{ compound.pubchem_id }}&width=300&height=300" style="width:300px;height:300px;"/> </div> <div class="col-sm-9"> <ul class="list-group"> diff --git a/ippisite/ippidb/templates/compound_list.html b/ippisite/ippidb/templates/compound_list.html index df4b25038688bd84b582e681a043fd9da40af30a..26917de79bec1069bb2351429d6fe2ba440ff4f3 100644 --- a/ippisite/ippidb/templates/compound_list.html +++ b/ippisite/ippidb/templates/compound_list.html @@ -1,5 +1,5 @@ {% extends "admin-session.html" %} - +{% load customtags %} {% block title %}compound{% endblock %} @@ -30,12 +30,22 @@ </nav> </div> {% include "kekule_display.html" %} +======= + <div class="container-fluid"> <div class="row flex-xl-nowrap"> <div class="col-12 col-md-3 col-xl-2 bd-sidebar"> <form> <fieldset class="form-group row border border-info m-2"> <div class="bg-info col-12"><legend>PPI</legend></div> + {% for ppi in selected_ppis %} + <div class="form-check col-12"> + <label class="form-check-label"> + <input class="form-check-input text-right" type="checkbox" checked value="{{ ppi.id }}" onchange="this.form.submit()" name="ppi" style="width: auto; margin-right: inherit!;"> + {{ ppi.name }} + </label> + </div> + {% endfor %} {% for ppi in ppis|slice:":5" %} <div class="form-check col-12"> <label class="form-check-label"> @@ -53,7 +63,7 @@ {% include "compound_abstract.html" with compound=compound %} {% endfor %} {% else %} - <p>No bibliographies available.</p> + <p>Nothing found there!</p> {% endif %} </main> </div> @@ -63,7 +73,7 @@ <ul class="pagination justify-content-end"> {% if compounds.has_previous %} <li class="page-item"> - <a class="page-link" href="?page={{ compounds.previous_page_number }}" tabindex="-1">Previous</a> + <a class="page-link" href="?{% url_replace request 'page' compounds.previous_page_number %}" tabindex="-1">Previous</a> </li> {% endif %} @@ -73,7 +83,7 @@ {% if compounds.has_next %} <li class="page-item"> - <a class="page-link" href="?page={{ compounds.next_page_number }}" tabindex="-1">Next</a> + <a class="page-link" href="?{% url_replace request 'page' compounds.next_page_number %}" tabindex="-1">Next</a> </li> {% endif %} </ul> diff --git a/ippisite/ippidb/templatetags/__init__.py b/ippisite/ippidb/templatetags/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ippisite/ippidb/templatetags/customtags.py b/ippisite/ippidb/templatetags/customtags.py new file mode 100644 index 0000000000000000000000000000000000000000..c01874f816c8d9e59c10eb2558494886a46063c4 --- /dev/null +++ b/ippisite/ippidb/templatetags/customtags.py @@ -0,0 +1,9 @@ +from django import template + +register = template.Library() + +@register.simple_tag +def url_replace(request, field, value): + dict_ = request.GET.copy() + dict_[field] = value + return dict_.urlencode() diff --git a/ippisite/ippidb/views.py b/ippisite/ippidb/views.py index 785b3ac9b6725bb7669ff739ec3a47adf469fbb3..2866d6ea3248514bc5e35032c96c446800e4940b 100644 --- a/ippisite/ippidb/views.py +++ b/ippisite/ippidb/views.py @@ -186,9 +186,17 @@ def biblio_card(request, source, id_source): 'tad_ppis': tad_ppis}) def compound_list(request): + """ + Display the list of compounds + """ compounds = Compound.objects.all() + # if filtering on "action on PPI" + if request.GET.get('ppi'): + compounds = compounds.filter(compoundaction__ppi__id__in=request.GET.getlist('ppi')) + selected_ppis = Ppi.objects.filter(id__in=request.GET.getlist('ppi')) + ppis = Ppi.objects.exclude(id__in=request.GET.getlist('ppi')) + # handle pagination in compounds list paginator = Paginator(compounds, 5) - ppis = Ppi.objects.all() page = request.GET.get('page') try: compounds = paginator.page(page) @@ -198,4 +206,4 @@ def compound_list(request): except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. compounds = paginator.page(paginator.num_pages) - return render(request, 'compound_list.html', {'compounds': compounds, 'ppis': ppis}) + return render(request, 'compound_list.html', {'compounds': compounds, 'selected_ppis': selected_ppis, 'ppis': ppis})