diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py index 533a9d6dd8140c86081619cbd63de8571b93b3c8..df53a3ea9933d445d35960694b12d6a97919af3b 100644 --- a/ippisite/ippidb/management/commands/import_v1_data.py +++ b/ippisite/ippidb/management/commands/import_v1_data.py @@ -3,11 +3,10 @@ import glob from django.utils import timezone from django.core.management import BaseCommand, CommandError import mysql.connector -from pybel import readfile from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction, \ Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi, PpiComplex, Disease, \ - Compound, MDDRCompoundImport, MDDRActivityClass, TestActivityDescription, CellLine + Compound, MDDRCompoundImport, MDDRActivityClass, TestActivityDescription, CellLine, RefCompoundBiblio class MyConverter(mysql.connector.conversion.MySQLConverter): @@ -77,6 +76,13 @@ class Command(BaseCommand): default=False, help='Flush and migrate compounds', ) + parser.add_argument( + '--compound-biblio', + action='store_true', + dest='compoundbiblio', + default=False, + help='Flush and migrate compounds-bibliography', + ) parser.add_argument( '--test-activity-description', action='store_true', @@ -301,6 +307,7 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, self.stdout.write( self.style.SUCCESS('Successfully inserted {}'.format(row[2]))) if options['mddr']: + from pybel import readfile MDDRCompoundImport.objects.all().delete() MDDRActivityClass.objects.all().delete() self.stdout.write( @@ -409,3 +416,30 @@ select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, else: self.stdout.write( self.style.SUCCESS('Successfully inserted {} {}'.format(row[1], row[2]))) + if options['compoundbiblio']: + cursor.execute("""select r.CmpdNameInBiblio, c.CanonicalSmile, b.IDSource from refCmpdBiblio as r inner join compound as c on r.IDCompound=c.IDCompound inner join biblio as b on r.IDBiblio=b.IDBiblio;""") + rows = cursor.fetchall() + RefCompoundBiblio.objects.all().delete() + self.stdout.write( + self.style.SUCCESS('Successfully flushed compound-biblio table')) + for row in rows: + try: + c = Compound.objects.get(canonical_smile=row[1]) + b = Bibliography.objects.get(id_source=row[2]) + r = RefCompoundBiblio() + r.compound_id = c.id + r.bibliography_id = b.id + r.compound_name = row[0] + r.save() + except Exception as e: + if options['stoponfail']: + import traceback + self.stderr.write(traceback.format_exc()) + raise CommandError( + 'Failed inserting {} {}'.format(row[1], row[2])) + else: + self.stdout.write( + self.style.ERROR('Failed inserting {} {}'.format(row[1], row[2]))) + else: + self.stdout.write( + self.style.SUCCESS('Successfully inserted {} {}'.format(row[1], row[2]))) diff --git a/ippisite/ippidb/static/css/ippidb.css b/ippisite/ippidb/static/css/ippidb.css index 53833fa497cb2038484967ae3fdac3b3c8407800..794a9f7c0330f1280320d8e4a772c4565e0dae68 100644 --- a/ippisite/ippidb/static/css/ippidb.css +++ b/ippisite/ippidb/static/css/ippidb.css @@ -92,9 +92,6 @@ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pr font-size:100%; vertical-align:baseline; background:transparent; - margin-left:auto; - margin-right:auto; - max-width: 1300px; font-family:"BrandonGrotesqueReg"; font-size: 18px; } diff --git a/ippisite/ippidb/templates/base.html b/ippisite/ippidb/templates/base.html index cc19b916e91e6a886dbc61d14ad7b6ba0c374aa6..6abdcff9b71c72fcdb1b49bfd71660d345b0d877 100644 --- a/ippisite/ippidb/templates/base.html +++ b/ippisite/ippidb/templates/base.html @@ -2,11 +2,12 @@ <html lang="en"> <head> <title>IPPI-DB {% block title %}{% endblock %}</title> - <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous"> +<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> <link rel="stylesheet" href="/static/css/ippidb.css"> - <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script> - <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script> + <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script> + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script> + <script src="/static/js/ippidb.js" type="text/javascript"></script> </head> diff --git a/ippisite/ippidb/templates/ppi_card.html b/ippisite/ippidb/templates/ppi_card.html new file mode 100644 index 0000000000000000000000000000000000000000..64fb070d8d8a6e6310f13871034b2c59c45d438b --- /dev/null +++ b/ippisite/ippidb/templates/ppi_card.html @@ -0,0 +1,80 @@ +{% extends "base.html" %} + + +{% block title %}inhibitors of Protein-Protein Interaction Database{% endblock %} + +{% block content %} +<div id="mainnav"> +</div> +<div class="inner-wrap"> + <nav class="breadcrumb" role="navigation"> + <div id="breadcrumb-label" class="breadcrumb-label">You are here</div> + <div aria-labelledby="breadcrumb-label"> + Fonction Fil d'Arianne + </div> + </nav> + <div id="main-wrapper" class="page"> + <div id="main"> + <div id="content" class="main-content"> + <main role="main"> + <div class="row"> + <div class="col-3"> + <div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist"> + <a class="nav-link active" id="v-pills-bib-tab" data-toggle="pill" href="#v-pills-bib" role="tab" aria-controls="v-pills-bib" aria-expanded="true">Bibliography</a> + <a class="nav-link" id="v-pills-comp-tab" data-toggle="pill" href="#v-pills-comp" role="tab" aria-controls="v-pills-comp" aria-expanded="true">Compounds</a> + <a class="nav-link" id="v-pills-target-tab" data-toggle="pill" href="#v-pills-target" role="tab" aria-controls="v-pills-target" aria-expanded="true">Targets</a> + <a class="nav-link" id="v-pills-test-tab" data-toggle="pill" href="#v-pills-test" role="tab" aria-controls="v-pills-test" aria-expanded="true">Tests</a> + </div> + </div> + <div class="col-9"> + <div class="tab-content" id="v-pills-tabContent"> + <div class="tab-pane fade show active" id="v-pills-bib" role="tabpanel" aria-labelledby="v-pills-bib-tab"> + <div class="card"> + <div class="card-body"> + <p><a target="_blank" class="card-link" href="https://www.ncbi.nlm.nih.gov/pubmed/{{ bibliography.id_source }}">{{ bibliography.authors_list }}. {{ authors.biblio_year }}. {{ bibliography.title }} {{ bibliography.journal_name }}. </a></p> + </div> + </div> + <div class="card"> + <div class="card-body"> + <ul class="list-group"> + <li class="list-group-item">Cytotoxicity data: {% if bibliography.cytotox %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item"><i>in silico</i> study: {% if bibliography.in_silico %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item"><i>in vitro</i> study: {% if bibliography.in_vitro %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item"><i>in vivo</i> study: {% if bibliography.in_vivo %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item"><i>in cellulo</i> study: {% if bibliography.in_cellulo %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item">pharmacokinetic study: {% if bibliography.pharmacokinetic %}✓{% else %}✗{% endif %}</li> + <li class="list-group-item">X-ray study: {% if bibliography.x_ray %}✓{% else %}✗{% endif %}</li> + </ul> + </div> + </div> + </div> + <div class="tab-pane fade" id="v-pills-comp" role="tabpanel" aria-labelledby="v-pills-comp-tab"> + {% for compound_biblio in compound_biblios %} + <div class="card"> + <div class="card-body"> + <ul class="list-group"> + <li class="list-group-item">Common name: {{ compound_biblio.compound.common_name }}</li> + <li class="list-group-item">MDDR: <i>TODO</i></li> + <li class="list-group-item">Canonical SMILES: {{ compound_biblio.compound.canonical_smile }}</li> + <li class="list-group-item">IUPAC name: {{ compound_biblio.compound.iupac_name }}</li> + <li class="list-group-item">mentionned as {{ compound_biblio.compound_name }}</li> + </ul> + </div> + </div> + {% endfor %} + </div> + <div class="tab-pane fade" id="v-pills-target" role="tabpanel" aria-labelledby="v-pills-target-tab"> + Target info + </div> + <div class="tab-pane fade" id="v-pills-test" role="tabpanel" aria-labelledby="v-pills-test-tab"> + Tests info + </div> + </div> + </div> + </div> + </main><!-- .site-main --> + </div> + </div><!-- div main --> + </div> +</div> +{% endblock %} diff --git a/ippisite/ippidb/urls.py b/ippisite/ippidb/urls.py index 74ad13bfd67a14b742f77a7bb676c512a8def79a..9228d00d4e7feba2d7cb392cc9bccc68ed9bc681 100644 --- a/ippisite/ippidb/urls.py +++ b/ippisite/ippidb/urls.py @@ -19,6 +19,7 @@ urlpatterns = [ url(r'^query$', views.query, name='query'), url(r'^query/pharma/$', views.pharma, name='pharma'), url(r'^query/chemical/$', views.chemical, name='chemical'), + url(r'^biblio_ppi/(?P<biblio_id>\d+)$', views.ppi_card, name='biblio_ppi_card'), url(r'^tutorials$', views.tutorials, name='tutorials'), url(r'^admin-session$', views.adminSession, name='admin-session'), url(r'^admin-session/add/(?P<step>.+)/$', diff --git a/ippisite/ippidb/views.py b/ippisite/ippidb/views.py index b852a0b04e61f3505627e07d77baaedd45e6bfd1..7e8e889edb07a45dbd59f1123b2dae5ab4ff296b 100644 --- a/ippisite/ippidb/views.py +++ b/ippisite/ippidb/views.py @@ -1,11 +1,10 @@ import ippidb from django.shortcuts import render -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, Http404 from formtools.wizard.views import SessionWizardView, NamedUrlSessionWizardView - from .forms import BibliographyForm, PDBForm, ProteinForm, ProteinDomainComplexTypeForm, ProteinDomainComplexForm, PpiForm, ProteinFormSet, PDBFormSet -from .models import Protein, Bibliography, ProteinDomainComplex +from .models import Protein, Bibliography, ProteinDomainComplex, RefCompoundBiblio from .ws import get_pdb_uniprot_mapping @@ -20,7 +19,6 @@ def about(request): def general(request): return render(request, 'general.html') - def pharmacology(request): return render(request, 'pharmacology.html') @@ -129,3 +127,12 @@ class IppiWizard(NamedUrlSessionWizardView): return render(self.request, '/admin-session/add.html', { 'form_data': [form.cleaned_data for form in form_list], }) + +def ppi_card(request, biblio_id): + try: + bibliography = Bibliography.objects.get(pk=biblio_id) + except Bibliography.DoesNotExist: + raise Http404("No bibliography data for %s" % biblio_id) + refs = RefCompoundBiblio.objects.filter(bibliography_id = bibliography.id) + return render(request, 'ppi_card.html', {'bibliography': bibliography, + 'compound_biblios': refs})