From 7089e79bd820146b433c76455e9fc18dc6996f4b Mon Sep 17 00:00:00 2001
From: Fredrik Jonsson <frjo@xdeb.org>
Date: Fri, 24 Aug 2018 12:03:42 +0200
Subject: [PATCH] Added migrations of concept notes and proposals.

---
 .../commands/migrate_concept_notes.py         | 168 +++++++++++++++++
 .../migrate_fellowship_application.py         |  11 +-
 .../management/commands/migrate_proposals.py  | 170 ++++++++++++++++++
 .../commands/migrate_rr_applications.py       |  18 +-
 .../management/commands/migration_base.py     |  19 +-
 5 files changed, 360 insertions(+), 26 deletions(-)
 create mode 100644 opentech/apply/funds/management/commands/migrate_concept_notes.py
 create mode 100644 opentech/apply/funds/management/commands/migrate_proposals.py

diff --git a/opentech/apply/funds/management/commands/migrate_concept_notes.py b/opentech/apply/funds/management/commands/migrate_concept_notes.py
new file mode 100644
index 000000000..681d7b2bc
--- /dev/null
+++ b/opentech/apply/funds/management/commands/migrate_concept_notes.py
@@ -0,0 +1,168 @@
+from opentech.apply.funds.management.commands.migration_base import MigrateCommand
+
+
+class Command(MigrateCommand):
+    CONTENT_TYPE = "fund"
+    FUND_NAME = "Internet Freedom Fund"
+    ROUND_NAME = "Internet Freedom Fund"
+    APPLICATION_TYPE = "concept"
+
+    STREAMFIELD_MAP = {
+        "title": {
+            "id": "title",
+            "type": "direct",
+        },
+        "field_concept_name": {
+            "id": "full_name",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_mail": {
+            "id": "email",
+            "type": "value",
+            "key": "email",
+        },
+        "field_concept_preapplied": {
+            "id": "0305a465-8763-4c1f-9197-4ca4227d452a",
+            "type": "map",
+            "map": {
+                "0": "No",
+                "1": "Yes",
+            },
+        },
+        "field_concept_preapplied_how": {
+            "id": "c24691be-9861-4dbc-8be4-03b6e68c1973",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_description": {
+            "id": "c21c58c3-cfbe-4409-b2f2-8f56398f1731",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_outcome": {
+            "id": "27289c14-6926-4f61-bea2-8031a653f71c",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_type": {
+            "id": "404e2310-000b-4ccb-b772-3680946ff07d",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_status": {
+            "id": "145c364f-e0bb-4652-94e8-fe08c831da2b",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_technology_attribute": {
+            "id": "b4da2310-9654-4aa7-a04a-06335967ddc5",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_concept_how": {
+            "id": "418b8099-4525-437f-a55c-9b35745d0384",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_focus": {
+            "id": "390702bd-e4e1-4dc2-8c43-d51bf018b427",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_concept_time": {
+            "id": "duration",
+            "type": "value",
+        },
+        "field_concept_amount": {
+            "id": "value",
+            "type": "value",
+        },
+        "field_concept_how_long": {
+            "id": "dfb9c307-9328-4a99-9efc-321d474b2ba7",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_who": {
+            "id": "11f94a22-0571-4491-a93e-87c050e02a4a",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_community": {
+            "id": "c272969b-d89f-4b6e-859f-4606a15b3f28",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_beneficiaries": {
+            "id": "72002c3e-aaee-47da-9377-8bb493f14c21",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_term_region": {
+            "id": "369b248e-f669-4aeb-b771-7cba0eadb921",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_term_country": {
+            "id": "57bceb33-ebda-4708-9080-fd1a5923e008",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_concept_why": {
+            "id": "c14ee077-c0eb-48b1-9825-fbba9b91ede5",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_theme": {
+            "id": "a83a1884-f711-4196-8d15-ae2110466acb",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_similar_efforts": {
+            "id": "9ca35708-d611-4cd0-8d4a-3cc08349f45b",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_contact": {
+            "id": "db7b1642-c03d-4af4-82c9-db67bf9713b0",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_concept_upload": {
+            "id": "8a91231c-5c3d-46fe-9de6-8d5c86817626",
+            "type": "file",
+            # TODO: finish mapping
+        },
+        "field_application_otf_mission": {
+            "id": "4c661a64-2614-4169-b4d2-1fd39e2e831b",
+            "type": "boolean",
+        },
+        "field_application_otf_tos": {
+            "id": "1bc4e113-1414-46ff-bba7-2dc02b2126df",
+            "type": "boolean",
+        },
+        "field_application_otf_represent": {
+            "id": "42dd68a1-b699-4678-bea6-13e0f842e821",
+            "type": "boolean",
+        },
+        "field_application_otf_license": {
+            "id": "72916731-ec97-4688-95f1-d3bf140b03c2",
+            "type": "boolean",
+        },
+        "field_application_otf_complete": {
+            "id": "6856d26d-b169-4fdf-b598-63c3dd9278a2",
+            "type": "boolean",
+        },
+        "field_application_otf_deadline": {
+            "id": "33838399-f292-4b63-83f0-e02d344f99d4",
+            "type": "boolean",
+        },
+        "field_application_otf_list": {
+            "id": "fc571e12-d4a2-4d53-ab34-2c57321dc6ac",
+            "type": "boolean",
+        },
+        "field_application_otf_newsletter": {
+            "id": "cd0d8a4b-e71a-4dff-964a-f547bd655e7d",
+            "type": "boolean",
+        },
+    }
diff --git a/opentech/apply/funds/management/commands/migrate_fellowship_application.py b/opentech/apply/funds/management/commands/migrate_fellowship_application.py
index f4c94d134..119dfec46 100644
--- a/opentech/apply/funds/management/commands/migrate_fellowship_application.py
+++ b/opentech/apply/funds/management/commands/migrate_fellowship_application.py
@@ -57,15 +57,8 @@ class Command(MigrateCommand):
             "key": "safe_value",
         },
         "field_application_duration2": {
-            "id": "611dacd7-553a-4be8-9283-1d006099d0c9",
-            "type": "map",
-            "map": {
-                "3": "3 months",
-                "6": "6 months",
-                "9": "9 months",
-                "12": "12 months",
-                "18": "18 months",
-            },
+            "id": "duration",
+            "type": "value",
         },
         "field_application_host_text": {
             "id": "0afaf4e1-4556-4e79-aa3d-4990e33620da",
diff --git a/opentech/apply/funds/management/commands/migrate_proposals.py b/opentech/apply/funds/management/commands/migrate_proposals.py
new file mode 100644
index 000000000..de64e45b8
--- /dev/null
+++ b/opentech/apply/funds/management/commands/migrate_proposals.py
@@ -0,0 +1,170 @@
+from opentech.apply.funds.management.commands.migration_base import MigrateCommand
+
+
+class Command(MigrateCommand):
+    CONTENT_TYPE = "fund"
+    FUND_NAME = "Internet Freedom Fund"
+    ROUND_NAME = "Internet Freedom Fund"
+    APPLICATION_TYPE = "proposal"
+
+    STREAMFIELD_MAP = {
+        "title": {
+            "id": "title",
+            "type": "direct",
+        },
+        "field_proposal_funding": {
+            "id": "value",
+            "type": "value",
+        },
+        "field_proposal_term_time": {
+            "id": "duration",
+            "type": "value",
+        },
+        "field_proposal_legal_entity_name": {
+            "id": "739a413b-46cc-4936-82ce-e68c2dfa41ca",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_common_name": {
+            "id": "full_name",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_entity_contact": {
+            "id": "a3c9af86-d047-4663-864a-b6dd97a60c39",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_entity_mail": {
+            "id": "email",
+            "type": "value",
+            "key": "email",
+        },
+        "field_proposal_entity_phone": {
+            "id": "40479d2a-7d53-4c81-834a-775ccd6c91c0",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_entity_address": {
+            "id": "f7e431b1-9965-4ebe-ab30-a00ff4b972ec",
+            "type": "address",
+            "map": {
+                "administrative_area": "administrativearea",
+                "country": "country",
+                "locality": "localityname",
+                "postal_code": "postalcode",
+                "thoroughfare": "thoroughfare",
+                "premise": "premise",
+            }
+        },
+        "field_proposal_summary": {
+            "id": "a7502e97-5f2e-417f-b08c-588d367e40e5",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_narrative": {
+            "id": "072f181b-90a2-4bb2-986d-55e1aaa9f348",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_objectives": {
+            "id": "a7ae7375-4569-47e2-8ee7-3c3d441375a9",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_activities": {
+            "id": "50328cc9-879d-4817-8454-2062ac47aef9",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_budget_details": {
+            "id": "7b0b0af4-009f-45db-b20c-5f991bce7752",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_similar_efforts": {
+            "id": "ba3733f3-bee8-4fe8-bdde-36812aa4df77",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_evaluation": {
+            "id": "23028eab-92c3-4c30-9a3e-5604dec0854d",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_sustainability": {
+            "id": "88d635e4-81d6-413c-8e09-52b74015e78b",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_fund_info": {
+            "id": "38072bb7-fcdd-4f74-9bfb-db45bfeb07a7",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_background": {
+            "id": "f8b340d0-8c0c-41f8-acb5-662c676e2bbd",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_references": {
+            "id": "8b2572ce-d118-41c4-b5d7-59f4ffe44431",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_community": {
+            "id": "1b93fcd1-c6cd-432a-b831-a0fb680e327e",
+            "type": "value",
+            "key": "safe_value",
+        },
+        "field_proposal_status": {
+            "id": "036fa233-c42a-4fc6-861a-ff40450efc7d",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_type": {
+            "id": "7d69aeec-009d-4de2-8dd2-6b0aacb4578f",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_focus": {
+            "id": "328590d3-fefd-410d-b745-12f2efdd5437",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_beneficiaries": {
+            "id": "f18f0399-538b-4bf3-9cd5-4457138814a8",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_theme": {
+            "id": "a9b2b6de-fb7b-4709-aa59-f0ad987a677a",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_technology_attribute": {
+            "id": "251cf41a-0a49-4725-8d5a-5e496d018647",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_term_region": {
+            "id": "ed6244ae-6903-4412-8b7a-c219ed25dfbb",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_term_country": {
+            "id": "4b79c527-bf24-47f1-87a7-39945e70caeb",
+            "type": "category",
+            "key": "tid",
+        },
+        "field_proposal_upload": {
+            "id": "6bec61a1-3527-4e21-aa65-f26d845bbb68",
+            "type": "file",
+            # TODO: finish mapping
+        },
+        "field_proposal_comments": {
+            "id": "c0ff8444-8d43-46ef-8498-ed1a32c09c6a",
+            "type": "value",
+            "key": "safe_value",
+        },
+    }
diff --git a/opentech/apply/funds/management/commands/migrate_rr_applications.py b/opentech/apply/funds/management/commands/migrate_rr_applications.py
index 1dae67829..61014b37b 100644
--- a/opentech/apply/funds/management/commands/migrate_rr_applications.py
+++ b/opentech/apply/funds/management/commands/migrate_rr_applications.py
@@ -72,16 +72,8 @@ class Command(MigrateCommand):
             "key": "safe_value",
         },
         "field_application_duration3": {
-            "id": "806d401c-b52c-46f7-9e96-f36fa70f53d8",
-            "type": "map",
-            "map": {
-                "1": "1 month",
-                "2": "2 months",
-                "3": "3 months",
-                "4": "4 months",
-                "5": "5 months",
-                "6": "6 months",
-            },
+            "id": "duration",
+            "type": "value",
         },
         "field_application_who": {
             "id": "1ec16cdc-7a68-40be-b17b-9a218def4260",
@@ -162,10 +154,10 @@ class Command(MigrateCommand):
             "id": "bd29eb88-9754-4305-9b2d-406a875ec56a",
             "type": "address",
             "map": {
-                "administrative_area": "administrative_area",
+                "administrative_area": "administrativearea",
                 "country": "country",
-                "locality": "locality_name",
-                "postal_code": "postal_code",
+                "locality": "localityname",
+                "postal_code": "postalcode",
                 "thoroughfare": "thoroughfare",
                 "premise": "premise",
             }
diff --git a/opentech/apply/funds/management/commands/migration_base.py b/opentech/apply/funds/management/commands/migration_base.py
index d4dc29974..08c9e13f8 100644
--- a/opentech/apply/funds/management/commands/migration_base.py
+++ b/opentech/apply/funds/management/commands/migration_base.py
@@ -75,6 +75,13 @@ class MigrateCommand(BaseCommand):
 
         submission.status = self.get_workflow_state(node)
 
+        if 'proposal_nid' in node:
+            try:
+                submission.next = ApplicationSubmission.objects.get(drupal_id=node['proposal_nid'])
+            except ApplicationSubmission.DoesNotExist:
+                self.stdout.write("No related proposal found, please import proposals before applications.")
+                pass
+
         form_data = {
             'skip_account_creation_notification': True,
         }
@@ -90,8 +97,8 @@ class MigrateCommand(BaseCommand):
         if "value" not in form_data:
             form_data["value"] = 0
 
-        if "duration" not in form_data:
-            form_data["duration"] = 0
+        if not form_data["duration"]:
+            form_data["duration"] = "1"
 
         submission.form_data = form_data
 
@@ -99,7 +106,7 @@ class MigrateCommand(BaseCommand):
             submission.save()
             self.stdout.write(f"Processed \"{node['title']}\" ({node['nid']})")
         except IntegrityError:
-            self.stdout.write(f"Skipped \"{node['title']}\" ({node['nid']}) due to IntegrityError")
+            self.stdout.write(f"*** Skipped \"{node['title']}\" ({node['nid']}) due to IntegrityError")
             pass
 
     def get_user(self, uid):
@@ -127,7 +134,10 @@ class MigrateCommand(BaseCommand):
         if mapping_type == "direct":
             value = source_value
         elif mapping_type == 'value':
-            value = self.nl2br(source_value[key]) if source_value else ''
+            if key in source_value:
+                value = self.nl2br(source_value[key]) if source_value else ''
+            else:
+                value = self.nl2br(source_value['value']) if source_value else ''
         elif mapping_type == 'map' and 'map' in 'mapping':
             value = mapping['map'].get(source_value[key])
         elif mapping_type == 'address' and 'map' in mapping:
@@ -136,6 +146,7 @@ class MigrateCommand(BaseCommand):
                 value = {}
                 for item in value_map:
                     value[value_map[item]] = source_value[item]
+                value = json.dumps(value)
             except TypeError:
                 value = {}
         elif mapping_type == 'boolean':
-- 
GitLab