From a0f5ef19b0f9325e48cc1e78788b4e928ac5c3c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr>
Date: Tue, 28 Mar 2017 22:47:44 +0200
Subject: [PATCH] Domain corrections and migration

correct Domain model, use PFAM service, add migration command
and update database.
---
 ippisite/db.sqlite3                           | Bin 512000 -> 520192 bytes
 .../management/commands/import_v1_data.py     |  29 +++++++++++++++++-
 .../migrations/0007_auto_20170328_2045.py     |  20 ++++++++++++
 ippisite/ippidb/models.py                     |  10 ++++--
 4 files changed, 56 insertions(+), 3 deletions(-)
 create mode 100644 ippisite/ippidb/migrations/0007_auto_20170328_2045.py

diff --git a/ippisite/db.sqlite3 b/ippisite/db.sqlite3
index 89d5cf044b79d1546780d04ccc912a4742b52c8c..4322d387f7390adb118f06d2b776199986ca1340 100644
GIT binary patch
delta 3057
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
PJU4zH$E9OUO!DKue3e$?

delta 472
zcmZp8Am6Y+euA{1Gy?-eEf7Niqu@jxV@BzX2}}5yg}HquvkRzic2tn#-s~g2n?;+2
zFN%K;e;$7XpEth<e>>k3zJ9)4e1&|!_^$9N@!Rpw<^9R8$$OW#hj;g8!Gb8>$vwJH
z7=<Sn>dj-EIaxrzTueZKS)C)Zpdd3PDLy4XH!(Ah{~`m+<hlC6jKa+y_1iz{Gj9K=
z&m^!wo9iuu5W{B%u6)h}PF3FH93Jdv*k-XVXNlqW=9|jw#T~-U!E=J~GfxS_=gE!=
z$Cq7ZV%#2bg(;kIyVG?hA;#_dZ!(=^VY3Wj6Zci0zVRB9{B)^$c2RDdCZ1q+admaZ
z=J4t7YT4x(t*0Aiv58Jsu4CWKmX?^CnNvA^ejckBqvrIc`%HB#+zS|_CpwBxUv-UX
z1`A&s!xf-q7p7fd3Yot8D%1bz9ru_H@$ka}4@hqhxxtjp$jG&sF@afOD+}|V`HLC^
z78L-I0+>WFHWjcaY-UOLBM)Q<w6jcL0b-#4Ca^t_;bDkj;M&IS%F@Ej!a0HCAd><^
o44VvV1P2qp0nmP%?J))H{@hH=?ZBw1WoEkxwtu@pJ^O_K00MlBuK)l5

diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py
index 5d6592cc..11861016 100644
--- a/ippisite/ippidb/management/commands/import_v1_data.py
+++ b/ippisite/ippidb/management/commands/import_v1_data.py
@@ -1,7 +1,7 @@
 from django.core.management import BaseCommand, CommandError
 import mysql.connector
 
-from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction
+from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction, Domain
 
 class Command(BaseCommand):
 
@@ -22,6 +22,13 @@ class Command(BaseCommand):
             default=False,
             help='Flush and migrate proteins',
         )
+        parser.add_argument(
+            '--domains',
+            action='store_true',
+            dest='domains',
+            default=False,
+            help='Flush and migrate domains',
+        )
         parser.add_argument(
             '--stoponfail',
             action='store_true',
@@ -75,4 +82,24 @@ class Command(BaseCommand):
                         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])))
+        if options['domains']:
+            cursor.execute("""SELECT * FROM domain""")
+            rows = cursor.fetchall()
+            Domain.objects.all().delete()
+            self.stdout.write(self.style.SUCCESS('Successfully flushed domain table'))
+            for row in rows:
+                try:
+                    p = Domain()
+                    p.pfam_acc = row[2]
+                    p.domain_family = row[4]
+                    p.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/migrations/0007_auto_20170328_2045.py b/ippisite/ippidb/migrations/0007_auto_20170328_2045.py
new file mode 100644
index 00000000..47a59cc6
--- /dev/null
+++ b/ippisite/ippidb/migrations/0007_auto_20170328_2045.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 20:45
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0006_auto_20170327_1439'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='domain',
+            old_name='domainfamily',
+            new_name='domain_family',
+        ),
+    ]
diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 4ce93714..325a849e 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, get_taxonomy_info, get_go_info
+from .ws import get_pubmed_info, get_epo_info, get_uniprot_info, get_taxonomy_info, get_go_info, get_pfam_info
 
 class Bibliography(models.Model):
     """
@@ -111,7 +111,13 @@ class Domain(models.Model):
     pfam_acc = models.CharField('Pfam Accession', max_length=10, unique=True) 
     pfam_id = models.CharField('Pfam Family Identifier', max_length=20) 
     pfam_description = models.CharField('Pfam Description', max_length=100)
-    domainfamily = models.CharField('Domain family', max_length=25)  #TODO: what is this field? check database contents
+    domain_family = models.CharField('Domain family', max_length=25)  #TODO: what is this field? check database contents
+
+    def save(self, *args, **kwargs):
+        info = get_pfam_info(self.pfam_acc)
+        self.pfam_id = info['id']
+        self.pfam_description = info['description']
+        super(Domain, self).save(*args, **kwargs)
 
 class ProteinDomainComplex(models.Model):
     protein_id = models.ForeignKey('Protein')
-- 
GitLab