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