From 49b1731881096e348a421f0ced0ceffb8c167d70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr>
Date: Mon, 22 May 2017 22:59:37 +0200
Subject: [PATCH] refine MDDR model, and implement MDDR import

fixes #21
---
 ippisite/ippidb/admin.py                      |  4 ++
 .../management/commands/import_v1_data.py     | 39 ++++++++++++++++++-
 .../migrations/0019_auto_20170522_1931.py     | 28 +++++++++++++
 .../migrations/0020_auto_20170522_1945.py     | 20 ++++++++++
 .../migrations/0021_auto_20170522_1949.py     | 20 ++++++++++
 ippisite/ippidb/models.py                     | 11 +++---
 6 files changed, 115 insertions(+), 7 deletions(-)
 create mode 100644 ippisite/ippidb/migrations/0019_auto_20170522_1931.py
 create mode 100644 ippisite/ippidb/migrations/0020_auto_20170522_1945.py
 create mode 100644 ippisite/ippidb/migrations/0021_auto_20170522_1949.py

diff --git a/ippisite/ippidb/admin.py b/ippisite/ippidb/admin.py
index 21a59ca3..18181267 100644
--- a/ippisite/ippidb/admin.py
+++ b/ippisite/ippidb/admin.py
@@ -32,6 +32,10 @@ class ProteinDomainPartnerComplexAdmin(admin.ModelAdmin):
 class Symmetry(admin.ModelAdmin):
     list_display = ('code', 'description')
 
+@admin.register(MDDRCompoundImport)
+class MDDRCompoundImport(admin.ModelAdmin):
+    list_display = ('mddr_name', 'dvpmt_phase', 'canonical_smile')
+
 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 de644fcc..1f6c40e7 100644
--- a/ippisite/ippidb/management/commands/import_v1_data.py
+++ b/ippisite/ippidb/management/commands/import_v1_data.py
@@ -1,9 +1,13 @@
+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
+    Compound, MDDRCompoundImport, MDDRActivityClass
 
 class Command(BaseCommand):
 
@@ -45,6 +49,13 @@ class Command(BaseCommand):
             default=False,
             help='Flush and migrate ppis and complexes',
         )
+        parser.add_argument(
+            '--mddr',
+            action='store_true',
+            dest='mddr',
+            default=False,
+            help='Flush and import MDDR database',
+        )
         parser.add_argument(
             '--compound',
             action='store_true',
@@ -211,6 +222,32 @@ select distinct protein.NumUniprot, domain.PfamNumAccession  , complexe.NbCopy,
                         self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1])))
                 else:
                     self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1])))
+        if options['mddr']:
+            MDDRCompoundImport.objects.all().delete()
+            MDDRActivityClass.objects.all().delete()
+            self.stdout.write(self.style.SUCCESS('Successfully flushed MDDR Compound and Activity class tables'))
+            for sdf_file in glob.glob('/home/hmenager/iPPIDB/mddr20151_2d.sdf/*.sdf'):
+                for item in readfile("sdf", sdf_file):
+                    try:
+                        m = MDDRCompoundImport()
+                        m.mddr_name = item.data['MOLNAME']
+                        m.canonical_smile = str(item)
+                        m.dvpmt_phase = item.data['PHASE']
+                        m.db_import_date = timezone.now()
+                        m.save()
+                        for activity_class_name in item.data['ACTIV_CLASS'].split(','):
+                            activity_class, created = MDDRActivityClass.objects.get_or_create(name=activity_class_name)
+                            m.activity_classes.add(activity_class)
+                        m.save()
+                    except Exception as e:
+                        if options['stoponfail']:
+                            import traceback
+                            self.stderr.write(traceback.format_exc())
+                            raise CommandError('Failed inserting {}'.format(str(item)))
+                        else:
+                            self.stdout.write(self.style.ERROR('Failed inserting {}'.format(str(item))))
+                    else:
+                        self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(item.data['MOLNAME'], str(item))))
         if options['compound']:
             cursor.execute("""SELECT * FROM compound""")
             rows = cursor.fetchall()
diff --git a/ippisite/ippidb/migrations/0019_auto_20170522_1931.py b/ippisite/ippidb/migrations/0019_auto_20170522_1931.py
new file mode 100644
index 00000000..4b1fb044
--- /dev/null
+++ b/ippisite/ippidb/migrations/0019_auto_20170522_1931.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.1 on 2017-05-22 19:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0018_auto_20170522_1501'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mddrcompoundimport',
+            name='db_import_date',
+            field=models.DateTimeField(verbose_name='MDDR release year/month'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='mddrcompoundimport',
+            unique_together=set([('mddr_name', 'dvpmt_phase', 'canonical_smile')]),
+        ),
+        migrations.RemoveField(
+            model_name='mddrcompoundimport',
+            name='mddr_compound_id',
+        ),
+    ]
diff --git a/ippisite/ippidb/migrations/0020_auto_20170522_1945.py b/ippisite/ippidb/migrations/0020_auto_20170522_1945.py
new file mode 100644
index 00000000..1aee4b10
--- /dev/null
+++ b/ippisite/ippidb/migrations/0020_auto_20170522_1945.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.1 on 2017-05-22 19:45
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0019_auto_20170522_1931'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='mddractivityclass',
+            old_name='activity_class',
+            new_name='name',
+        ),
+    ]
diff --git a/ippisite/ippidb/migrations/0021_auto_20170522_1949.py b/ippisite/ippidb/migrations/0021_auto_20170522_1949.py
new file mode 100644
index 00000000..fcb415f2
--- /dev/null
+++ b/ippisite/ippidb/migrations/0021_auto_20170522_1949.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.1 on 2017-05-22 19:49
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0020_auto_20170522_1945'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mddrcompoundimport',
+            name='canonical_smile',
+            field=models.CharField(blank=True, max_length=500, null=True, verbose_name='Canonical Smile'),
+        ),
+    ]
diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 48fb10e3..377f692a 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -244,27 +244,26 @@ class Compound(models.Model):
 
 
 class MDDRActivityClass(models.Model):
-    activity_class = models.CharField('Activity Class', max_length=100, unique=True)  
+    name = models.CharField('Activity Class', max_length=100, unique=True)  
 
     class Meta:
         verbose_name_plural = "MDDR activity classes"
 
     def __str__(self):
-        return self.activity_class
+        return self.name
 
 class MDDRCompoundImport(models.Model):
-    mddr_compound_id = models.IntegerField('MDDR compound ID')  
     mddr_name = models.CharField('MDDR name', max_length=40)  
     dvpmt_phase = models.CharField('Development phase', max_length=20)  
-    canonical_smile = models.CharField('Canonical Smile', max_length=500, unique=True, blank=True, null=True)  
+    canonical_smile = models.CharField('Canonical Smile', max_length=500, blank=True, null=True)  
     #TODO index this table on canonical_smile
-    db_import_date = models.DecimalField('MDDR release year/month', max_digits=6, decimal_places=0)  
+    db_import_date = models.DateTimeField('MDDR release year/month')  
     activity_classes = models.ManyToManyField(MDDRActivityClass)
 
     class Meta:
         # 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'),)
+        unique_together = (('mddr_name', 'dvpmt_phase', 'canonical_smile'),)
         verbose_name_plural = "MDDR compound imports"
 
 class MDDRSimilarity(models.Model):
-- 
GitLab