diff --git a/ippisite/ippidb/admin.py b/ippisite/ippidb/admin.py index 08ea5e39a55ad1f2a33f1a43bc0ff9c8f755d833..29b059b53b45ac71042ed0257ab091187cf3c2a9 100644 --- a/ippisite/ippidb/admin.py +++ b/ippisite/ippidb/admin.py @@ -6,6 +6,14 @@ from django.apps import apps class BibliographyAdmin(admin.ModelAdmin): list_display = ('authors_list', 'title', 'journal_name', 'biblio_year', 'id_source') +@admin.register(Protein) +class ProteinAdmin(admin.ModelAdmin): + list_display = ('uniprot_id', 'recommended_name_long') + +@admin.register(Taxonomy) +class TaxonomyAdmin(admin.ModelAdmin): + list_display = ('taxonomy_id', 'name') + for model in apps.get_app_config('ippidb').models.values(): try: admin.site.register(model) diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py index 22a073ef0729f7b6508e2dbbe56e1deb9c8124a1..8820aca4aba57dd59f10d82de0826fd08ab9c9b0 100644 --- a/ippisite/ippidb/management/commands/import_v1_data.py +++ b/ippisite/ippidb/management/commands/import_v1_data.py @@ -1,6 +1,7 @@ -from django.core.management import BaseCommand +from django.core.management import BaseCommand, CommandError import mysql.connector -from ippidb.models import Bibliography, Protein + +from ippidb.models import Bibliography, Protein, Taxonomy class Command(BaseCommand): @@ -21,6 +22,14 @@ class Command(BaseCommand): default=False, help='Flush and migrate proteins', ) + parser.add_argument( + '--stoponfail', + action='store_true', + dest='stoponfail', + default=False, + help='Stop on fail', + ) + def handle(self, *args, **options): conn = mysql.connector.connect(host="localhost",user="root",password="ippidb", database="ippidb") @@ -48,13 +57,20 @@ class Command(BaseCommand): rows = cursor.fetchall() Protein.objects.all().delete() self.stdout.write(self.style.SUCCESS('Successfully flushed protein table')) + Taxonomy.objects.all().delete() + self.stdout.write(self.style.SUCCESS('Successfully flushed taxonomy table')) for row in rows: try: p = Protein() p.uniprot_id = row[1] p.save() except Exception as e: - self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[1], row[2]))) + 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/models.py b/ippisite/ippidb/models.py index 79b3f7ffa98ba41130dab4b15dbf55d010be1c74..5f7e7f5abc6d3ada934576367347ddf67693f54a 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.db import models from django.forms import ModelForm -from .ws import get_pubmed_info, get_epo_info, get_uniprot_info +from .ws import get_pubmed_info, get_epo_info, get_uniprot_info, get_taxonomy_info class Bibliography(models.Model): """ @@ -50,8 +50,14 @@ class BibliographyForm(ModelForm): exclude = ['title','journal_name', 'authors_list', 'biblio_year'] class Taxonomy(models.Model): - taxonomy_id = models.DecimalField('NCBI TaxID', unique=True, max_digits=4, decimal_places=0) + taxonomy_id = models.DecimalField('NCBI TaxID', unique=True, max_digits=9, decimal_places=0) name = models.CharField('Organism name', max_length=200) + + def save(self, *args, **kwargs): + info = get_taxonomy_info(self.taxonomy_id) + self.name = info['scientific_name'] + super(Taxonomy, self).save(*args, **kwargs) + class Meta: verbose_name_plural = "taxonomies" @@ -69,9 +75,18 @@ class Protein(models.Model): molecular_functions = models.ManyToManyField(MolecularFunction) def save(self, *args, **kwargs): - info = get_epo_info(self.id_source) + info = get_uniprot_info(self.uniprot_id) self.recommended_name_long = info['recommended_name'] - self.organism = info['organism'] + self.gene_name = info['gene'] + self.entry_name = info['entry_name'] + try: + taxonomy = Taxonomy.objects.get(taxonomy_id=info['organism']) + except Taxonomy.DoesNotExist: + tax_info = get_taxonomy_info(info['organism']) + taxonomy = Taxonomy() + taxonomy.taxonomy_id = info['organism'] + taxonomy.save() + self.organism = taxonomy super(Protein, self).save(*args, **kwargs) class Domain(models.Model): @@ -191,6 +206,7 @@ class MDDRCompoundImport(models.Model): # over multiple releases of the MDDR database, the same compound can evolve in its development phase # the same compound can have different names and development phases in the same MDDR release unique_together = (('mddr_compound_id', 'mddr_name', 'dvpmt_phase'),) + verbose_name_plural = "MDDR compound imports" class MDDRCompoundActivityClass(models.Model): @@ -199,6 +215,7 @@ class MDDRCompoundActivityClass(models.Model): class Meta: unique_together = (('mddr_compound_id', 'activity_class'),) + verbose_name_plural = "MDDR compound activity classes" class MDDRSimilarity(models.Model): @@ -208,6 +225,7 @@ class MDDRSimilarity(models.Model): class Meta: unique_together = (('canonical_smile_ippidb', 'canonical_smile_mddr'),) + verbose_name_plural = "MDDR similarities" """ class TestActivityDescription(models.Model): diff --git a/ippisite/ippidb/ws.py b/ippisite/ippidb/ws.py index 422a5219ab38cde7844249ba0962e58ca891e3f2..8b9b3f3a9f415d0f417ac0212a5a9c5736c644a3 100644 --- a/ippisite/ippidb/ws.py +++ b/ippisite/ippidb/ws.py @@ -36,10 +36,20 @@ def get_epo_info(patent_number): 'authors_list': authors} def get_uniprot_info(uniprot_id): - uniprot_client = Uniprot() + uniprot_client = UniProt() resp = uniprot_client.retrieve(uniprot_id) - recommended_name = res.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}protein/{http://uniprot.org/uniprot}recommendedName/{http://uniprot.org/uniprot}fullName')[0].text - organism = res.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}organism/{http://uniprot.org/uniprot}dbReference[@type="NCBI Taxonomy"]/@id') + recommended_name = resp.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}protein/{http://uniprot.org/uniprot}recommendedName/{http://uniprot.org/uniprot}fullName')[0].text + organism = resp.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}organism/{http://uniprot.org/uniprot}dbReference[@type="NCBI Taxonomy"]')[0].attrib['id'] + gene = resp.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}gene/{http://uniprot.org/uniprot}name[@type="primary"]')[0].text + entry_name = resp.root.findall('{http://uniprot.org/uniprot}entry/{http://uniprot.org/uniprot}name')[0].text return {'recommended_name': recommended_name, - 'organism': organism - } + 'organism': int(organism), + 'gene': gene, + 'entry_name': entry_name + } + +def get_taxonomy_info(taxonomy_id): + eu = EUtils() + r = eu.EFetch('taxonomy', taxonomy_id, retmode='dict') + scientific_name = r['TaxaSet']['Taxon']['ScientificName'] + return {'scientific_name': scientific_name}