From 2fcc83ef08eab99aab476f1833407d175191767a Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Sat, 22 Sep 2018 14:33:26 +0200
Subject: [PATCH] Update petitions.PetitionSignatory to new org

This uses a multi-step migration cycle:
- rename existing organization field to organization_tbd
- add a new field org
- perform a data migration from organization_tbd to org
- delete organization_tbd
- rename org to organization
---
 .../migrations/0004_auto_20180922_1357.py     | 20 +++++++++++++
 .../0005_petitionsignatory_organization.py    | 22 ++++++++++++++
 .../0006_repopulate_petsign_orgs.py           | 29 +++++++++++++++++++
 ...move_petitionsignatory_organization_tbd.py | 19 ++++++++++++
 .../migrations/0008_auto_20180922_1432.py     | 20 +++++++++++++
 petitions/models.py                           |  2 +-
 6 files changed, 111 insertions(+), 1 deletion(-)
 create mode 100644 petitions/migrations/0004_auto_20180922_1357.py
 create mode 100644 petitions/migrations/0005_petitionsignatory_organization.py
 create mode 100644 petitions/migrations/0006_repopulate_petsign_orgs.py
 create mode 100644 petitions/migrations/0007_remove_petitionsignatory_organization_tbd.py
 create mode 100644 petitions/migrations/0008_auto_20180922_1432.py

diff --git a/petitions/migrations/0004_auto_20180922_1357.py b/petitions/migrations/0004_auto_20180922_1357.py
new file mode 100644
index 000000000..ce83b0307
--- /dev/null
+++ b/petitions/migrations/0004_auto_20180922_1357.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-09-22 11:57
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('petitions', '0003_petitionsignatory_organization'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='petitionsignatory',
+            old_name='organization',
+            new_name='organization_tbd',
+        ),
+    ]
diff --git a/petitions/migrations/0005_petitionsignatory_organization.py b/petitions/migrations/0005_petitionsignatory_organization.py
new file mode 100644
index 000000000..9e0e8e262
--- /dev/null
+++ b/petitions/migrations/0005_petitionsignatory_organization.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-09-22 11:58
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organizations', '0002_populate_from_partners_org'),
+        ('petitions', '0004_auto_20180922_1357'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='petitionsignatory',
+            name='org',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='petition_signatories', to='organizations.Organization'),
+        ),
+    ]
diff --git a/petitions/migrations/0006_repopulate_petsign_orgs.py b/petitions/migrations/0006_repopulate_petsign_orgs.py
new file mode 100644
index 000000000..a82629b89
--- /dev/null
+++ b/petitions/migrations/0006_repopulate_petsign_orgs.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-09-22 12:05
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+def repopulate_organization_field(apps, schema_editor):
+    PetitionSignatory = apps.get_model('petitions', 'PetitionSignatory')
+    Organization = apps.get_model('organizations', 'Organization')
+    PartnersOrganization = apps.get_model('partners', 'Organization')
+
+    for petsign in PetitionSignatory.objects.all():
+        if petsign.organization_tbd:
+            org = Organization.objects.get(name=petsign.organization_tbd.name)
+            petsign.org = org
+            petsign.save()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('petitions', '0005_petitionsignatory_organization'),
+    ]
+
+    operations = [
+        migrations.RunPython(repopulate_organization_field,
+                             reverse_code=migrations.RunPython.noop),
+    ]
diff --git a/petitions/migrations/0007_remove_petitionsignatory_organization_tbd.py b/petitions/migrations/0007_remove_petitionsignatory_organization_tbd.py
new file mode 100644
index 000000000..729a0fd10
--- /dev/null
+++ b/petitions/migrations/0007_remove_petitionsignatory_organization_tbd.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-09-22 12:30
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('petitions', '0006_repopulate_petsign_orgs'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='petitionsignatory',
+            name='organization_tbd',
+        ),
+    ]
diff --git a/petitions/migrations/0008_auto_20180922_1432.py b/petitions/migrations/0008_auto_20180922_1432.py
new file mode 100644
index 000000000..bdce3bf60
--- /dev/null
+++ b/petitions/migrations/0008_auto_20180922_1432.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-09-22 12:32
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('petitions', '0007_remove_petitionsignatory_organization_tbd'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='petitionsignatory',
+            old_name='org',
+            new_name='organization',
+        ),
+    ]
diff --git a/petitions/models.py b/petitions/models.py
index 02385fb91..bcd50ed24 100644
--- a/petitions/models.py
+++ b/petitions/models.py
@@ -39,7 +39,7 @@ class PetitionSignatory(models.Model):
     email = models.EmailField()
     country_of_employment = CountryField()
     affiliation = models.CharField(max_length=300, verbose_name='affiliation')
-    organization = models.ForeignKey('partners.Organization', blank=True, null=True,
+    organization = models.ForeignKey('organizations.Organization', blank=True, null=True,
                                      on_delete=models.SET_NULL)
     signed_on = models.DateTimeField(auto_now_add=True)
     verification_key = models.CharField(max_length=40, blank=True)
-- 
GitLab