From 98eded4c2a6af288e16ab5d6400d76ca65c03516 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Thu, 4 May 2017 21:22:03 +0200
Subject: [PATCH] Fix migrations bug: CAUTION README!

This commit fixes the migration bug which made postgresql
think there still was a relation to a non-exisition table
called scipost_feedback, scipost_motion and scipost_nomination.

CAUTION! This will however reset all existing relations
with the Remark model to VGM models.
---
 scipost/migrations/0039_auto_20170306_0804.py | 84 +---------------
 scipost/migrations/0051_auto_20170504_1359.py | 55 +++++++++++
 scipost/migrations/0052_auto_20170504_1404.py | 96 +++++++++++++++++++
 scipost/migrations/0053_auto_20170504_1538.py | 32 +++++++
 scipost/migrations/0054_delete_newsitem.py    | 23 +++++
 virtualmeetings/migrations/0001_initial.py    | 20 +---
 virtualmeetings/models.py                     | 30 ++----
 7 files changed, 221 insertions(+), 119 deletions(-)
 create mode 100644 scipost/migrations/0051_auto_20170504_1359.py
 create mode 100644 scipost/migrations/0052_auto_20170504_1404.py
 create mode 100644 scipost/migrations/0053_auto_20170504_1538.py
 create mode 100644 scipost/migrations/0054_delete_newsitem.py

diff --git a/scipost/migrations/0039_auto_20170306_0804.py b/scipost/migrations/0039_auto_20170306_0804.py
index 49894a205..5be053234 100644
--- a/scipost/migrations/0039_auto_20170306_0804.py
+++ b/scipost/migrations/0039_auto_20170306_0804.py
@@ -12,87 +12,7 @@ class Migration(migrations.Migration):
         ('scipost', '0038_nomination_webpage'),
     ]
 
-    state_operations = [
-        migrations.RemoveField(
-            model_name='feedback',
-            name='VGM',
-        ),
-        migrations.RemoveField(
-            model_name='feedback',
-            name='by',
-        ),
-        migrations.RemoveField(
-            model_name='motion',
-            name='VGM',
-        ),
-        migrations.RemoveField(
-            model_name='motion',
-            name='in_agreement',
-        ),
-        migrations.RemoveField(
-            model_name='motion',
-            name='in_disagreement',
-        ),
-        migrations.RemoveField(
-            model_name='motion',
-            name='in_notsure',
-        ),
-        migrations.RemoveField(
-            model_name='motion',
-            name='put_forward_by',
-        ),
-        migrations.DeleteModel(
-            name='NewsItem',
-        ),
-        migrations.RemoveField(
-            model_name='nomination',
-            name='VGM',
-        ),
-        migrations.RemoveField(
-            model_name='nomination',
-            name='by',
-        ),
-        migrations.RemoveField(
-            model_name='nomination',
-            name='in_agreement',
-        ),
-        migrations.RemoveField(
-            model_name='nomination',
-            name='in_disagreement',
-        ),
-        migrations.RemoveField(
-            model_name='nomination',
-            name='in_notsure',
-        ),
-        migrations.AlterField(
-            model_name='remark',
-            name='feedback',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Feedback'),
-        ),
-        migrations.AlterField(
-            model_name='remark',
-            name='motion',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Motion'),
-        ),
-        migrations.AlterField(
-            model_name='remark',
-            name='nomination',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Nomination'),
-        ),
-        migrations.DeleteModel(
-            name='Feedback',
-        ),
-        migrations.DeleteModel(
-            name='Motion',
-        ),
-        migrations.DeleteModel(
-            name='Nomination',
-        ),
-        migrations.DeleteModel(
-            name='VGM',
-        ),
-    ]
-
     operations = [
-        migrations.SeparateDatabaseAndState(state_operations=state_operations)
+        # I'm in a vacuum state.
+        # Please don't remove me though...
     ]
diff --git a/scipost/migrations/0051_auto_20170504_1359.py b/scipost/migrations/0051_auto_20170504_1359.py
new file mode 100644
index 000000000..93ec6c4ee
--- /dev/null
+++ b/scipost/migrations/0051_auto_20170504_1359.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-04 11:59
+from __future__ import unicode_literals
+
+from django.db import migrations
+from django.db.migrations.exceptions import InvalidMigrationPlan
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0050_auto_20170416_2152'),
+    ]
+
+    operations = [
+        migrations.AlterModelTable(
+            name='Feedback',
+            table='scipost_feedback',
+        ),
+        migrations.AlterModelTable(
+            name='Motion',
+            table='scipost_motion',
+        ),
+        migrations.AlterModelTable(
+            name='Nomination',
+            table='scipost_nomination',
+        ),
+        migrations.AlterModelTable(
+            name='VGM',
+            table='scipost_vgm',
+        ),
+        migrations.RemoveField(
+            model_name='remark',
+            name='feedback',
+        ),
+        migrations.RemoveField(
+            model_name='remark',
+            name='motion',
+        ),
+        migrations.RemoveField(
+            model_name='remark',
+            name='nomination',
+        ),
+    ]
+
+    def apply(self, *args, **kwargs):
+        '''Forward apply the migration only if user explictly accepts the migration.'''
+        print('\n\nDue to earlier migration issues, this migration will remove the Remark foreignkey'
+              ' data to `Feedback`, `Motion` and `Nomination`. Please make a backup to'
+              ' be able to *manually* fix the relations afterwards.')
+        go_ahead = input(' Do you want to continue? [y/N] ')
+        if go_ahead == 'y':
+            return super().apply(*args, **kwargs)
+        else:
+            raise InvalidMigrationPlan
diff --git a/scipost/migrations/0052_auto_20170504_1404.py b/scipost/migrations/0052_auto_20170504_1404.py
new file mode 100644
index 000000000..26c68461e
--- /dev/null
+++ b/scipost/migrations/0052_auto_20170504_1404.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-04 12:04
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0051_auto_20170504_1359'),
+    ]
+
+    database_operations = [
+        migrations.AlterModelTable('Motion', 'virtualmeetings_motion'),
+        migrations.AlterModelTable('Feedback', 'virtualmeetings_feedback'),
+        migrations.AlterModelTable('Nomination', 'virtualmeetings_nomination'),
+        migrations.AlterModelTable('VGM', 'virtualmeetings_vgm'),
+        migrations.AlterField(
+            model_name='motion',
+            name='VGM',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.VGM'),
+        ),
+        migrations.AlterField(
+            model_name='feedback',
+            name='VGM',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.VGM'),
+        ),
+        migrations.AlterField(
+            model_name='nomination',
+            name='VGM',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.VGM'),
+        ),
+    ]
+
+    state_operations = [
+        migrations.RemoveField(
+            model_name='feedback',
+            name='VGM',
+        ),
+        migrations.RemoveField(
+            model_name='feedback',
+            name='by',
+        ),
+        migrations.RemoveField(
+            model_name='motion',
+            name='VGM',
+        ),
+        migrations.RemoveField(
+            model_name='motion',
+            name='in_agreement',
+        ),
+        migrations.RemoveField(
+            model_name='motion',
+            name='in_disagreement',
+        ),
+        migrations.RemoveField(
+            model_name='motion',
+            name='in_notsure',
+        ),
+        migrations.RemoveField(
+            model_name='motion',
+            name='put_forward_by',
+        ),
+        migrations.RemoveField(
+            model_name='nomination',
+            name='VGM',
+        ),
+        migrations.RemoveField(
+            model_name='nomination',
+            name='by',
+        ),
+        migrations.RemoveField(
+            model_name='nomination',
+            name='in_agreement',
+        ),
+        migrations.RemoveField(
+            model_name='nomination',
+            name='in_disagreement',
+        ),
+        migrations.RemoveField(
+            model_name='nomination',
+            name='in_notsure',
+        ),
+        migrations.DeleteModel('Motion'),
+        migrations.DeleteModel('Feedback'),
+        migrations.DeleteModel('Nomination'),
+        migrations.DeleteModel('VGM')
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            database_operations=database_operations,
+            state_operations=state_operations)
+    ]
diff --git a/scipost/migrations/0053_auto_20170504_1538.py b/scipost/migrations/0053_auto_20170504_1538.py
new file mode 100644
index 000000000..91b9c57bb
--- /dev/null
+++ b/scipost/migrations/0053_auto_20170504_1538.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-04 13:38
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('virtualmeetings', '0001_initial'),
+        ('scipost', '0052_auto_20170504_1404'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='remark',
+            name='feedback',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Feedback'),
+        ),
+        migrations.AddField(
+            model_name='remark',
+            name='motion',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Motion'),
+        ),
+        migrations.AddField(
+            model_name='remark',
+            name='nomination',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='virtualmeetings.Nomination'),
+        ),
+    ]
diff --git a/scipost/migrations/0054_delete_newsitem.py b/scipost/migrations/0054_delete_newsitem.py
new file mode 100644
index 000000000..83bd9bc58
--- /dev/null
+++ b/scipost/migrations/0054_delete_newsitem.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-04 19:04
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0053_auto_20170504_1538'),
+    ]
+
+    state_operations = [
+        migrations.DeleteModel(
+            name='NewsItem',
+        ),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            state_operations=state_operations)
+    ]
diff --git a/virtualmeetings/migrations/0001_initial.py b/virtualmeetings/migrations/0001_initial.py
index 492b8e80e..cbfb62cfe 100644
--- a/virtualmeetings/migrations/0001_initial.py
+++ b/virtualmeetings/migrations/0001_initial.py
@@ -24,10 +24,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('date', models.DateField()),
                 ('feedback', models.TextField()),
-            ],
-            options={
-                'db_table': 'scipost_feedback',
-            },
+            ]
         ),
         migrations.CreateModel(
             name='Motion',
@@ -42,10 +39,7 @@ class Migration(migrations.Migration):
                 ('nr_D', models.PositiveIntegerField(default=0)),
                 ('voting_deadline', models.DateTimeField(default=django.utils.timezone.now, verbose_name='voting deadline')),
                 ('accepted', models.NullBooleanField()),
-            ],
-            options={
-                'db_table': 'scipost_motion',
-            },
+            ]
         ),
         migrations.CreateModel(
             name='Nomination',
@@ -62,10 +56,7 @@ class Migration(migrations.Migration):
                 ('nr_D', models.PositiveIntegerField(default=0)),
                 ('voting_deadline', models.DateTimeField(default=django.utils.timezone.now, verbose_name='voting deadline')),
                 ('accepted', models.NullBooleanField()),
-            ],
-            options={
-                'db_table': 'scipost_nomination',
-            },
+            ]
         ),
         migrations.CreateModel(
             name='VGM',
@@ -74,10 +65,7 @@ class Migration(migrations.Migration):
                 ('start_date', models.DateField()),
                 ('end_date', models.DateField()),
                 ('information', models.TextField(default='')),
-            ],
-            options={
-                'db_table': 'scipost_vgm',
-            },
+            ]
         ),
         migrations.AddField(
             model_name='nomination',
diff --git a/virtualmeetings/models.py b/virtualmeetings/models.py
index f78744fc9..7e6d9ffcb 100644
--- a/virtualmeetings/models.py
+++ b/virtualmeetings/models.py
@@ -21,9 +21,6 @@ class VGM(models.Model):
     end_date = models.DateField()
     information = models.TextField(default='')
 
-    class Meta:
-        db_table = 'scipost_vgm'
-
     def __str__(self):
         return 'From %s to %s' % (self.start_date.strftime('%Y-%m-%d'),
                                   self.end_date.strftime('%Y-%m-%d'))
@@ -33,14 +30,11 @@ class Feedback(models.Model):
     """
     Feedback, suggestion or criticism on any aspect of SciPost.
     """
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
-    by = models.ForeignKey(Contributor)
+    VGM = models.ForeignKey('virtualmeetings.VGM', blank=True, null=True)
+    by = models.ForeignKey('scipost.Contributor')
     date = models.DateField()
     feedback = models.TextField()
 
-    class Meta:
-        db_table = 'scipost_feedback'
-
     def __str__(self):
         return '%s: %s' % (self.by, self.feedback[:50])
 
@@ -61,8 +55,8 @@ class Nomination(models.Model):
     """
     Nomination to an Editorial Fellowship.
     """
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
-    by = models.ForeignKey(Contributor)
+    VGM = models.ForeignKey('virtualmeetings.VGM', blank=True, null=True)
+    by = models.ForeignKey('scipost.Contributor')
     date = models.DateField()
     first_name = models.CharField(max_length=30, default='')
     last_name = models.CharField(max_length=30, default='')
@@ -85,9 +79,6 @@ class Nomination(models.Model):
     voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
     accepted = models.NullBooleanField()
 
-    class Meta:
-        db_table = 'scipost_nomination'
-
     def __str__(self):
         return '%s %s (nominated by %s)' % (self.first_name,
                                             self.last_name,
@@ -154,27 +145,24 @@ class Motion(models.Model):
     They are meant to be voted on at the annual VGM.
     """
     category = models.CharField(max_length=10, choices=MOTION_CATEGORIES, default='General')
-    VGM = models.ForeignKey(VGM, blank=True, null=True)
+    VGM = models.ForeignKey('virtualmeetings.VGM', blank=True, null=True)
     background = models.TextField()
     motion = models.TextField()
-    put_forward_by = models.ForeignKey(Contributor)
+    put_forward_by = models.ForeignKey('scipost.Contributor')
     date = models.DateField()
     nr_A = models.PositiveIntegerField(default=0)
-    in_agreement = models.ManyToManyField(Contributor,
+    in_agreement = models.ManyToManyField('scipost.Contributor',
                                           related_name='in_agreement_with_motion', blank=True)
     nr_N = models.PositiveIntegerField(default=0)
-    in_notsure = models.ManyToManyField(Contributor,
+    in_notsure = models.ManyToManyField('scipost.Contributor',
                                         related_name='in_notsure_with_motion', blank=True)
     nr_D = models.PositiveIntegerField(default=0)
-    in_disagreement = models.ManyToManyField(Contributor,
+    in_disagreement = models.ManyToManyField('scipost.Contributor',
                                              related_name='in_disagreement_with_motion',
                                              blank=True)
     voting_deadline = models.DateTimeField('voting deadline', default=timezone.now)
     accepted = models.NullBooleanField()
 
-    class Meta:
-        db_table = 'scipost_motion'
-
     def __str__(self):
         return self.motion[:32]
 
-- 
GitLab