From d62963b77b09b3e2205607c4e77e96ff8bcbd83e Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Thu, 9 Aug 2018 12:55:16 +0100
Subject: [PATCH] Make review forms behave the same way as application forms

a new instance is copied onto the round
---
 .../migrations/0040_roundbasereviewform.py    | 29 +++++++++++++++++++
 opentech/apply/funds/models/applications.py   | 25 +++++++++++-----
 opentech/apply/funds/models/forms.py          |  4 +++
 3 files changed, 51 insertions(+), 7 deletions(-)
 create mode 100644 opentech/apply/funds/migrations/0040_roundbasereviewform.py

diff --git a/opentech/apply/funds/migrations/0040_roundbasereviewform.py b/opentech/apply/funds/migrations/0040_roundbasereviewform.py
new file mode 100644
index 000000000..4f27a6ada
--- /dev/null
+++ b/opentech/apply/funds/migrations/0040_roundbasereviewform.py
@@ -0,0 +1,29 @@
+# Generated by Django 2.0.2 on 2018-08-09 11:29
+
+from django.db import migrations, models
+import django.db.models.deletion
+import modelcluster.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('review', '0006_remove_review_review'),
+        ('funds', '0039_add_rfps_and_sealed_rounds'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='RoundBaseReviewForm',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('sort_order', models.IntegerField(blank=True, editable=False, null=True)),
+                ('form', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='review.ReviewForm')),
+                ('round', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='review_forms', to='funds.RoundBase')),
+            ],
+            options={
+                'ordering': ['sort_order'],
+                'abstract': False,
+            },
+        ),
+    ]
diff --git a/opentech/apply/funds/models/applications.py b/opentech/apply/funds/models/applications.py
index ffccab077..0e4fffcc5 100644
--- a/opentech/apply/funds/models/applications.py
+++ b/opentech/apply/funds/models/applications.py
@@ -115,7 +115,9 @@ class RoundBase(WorkflowStreamForm, SubmittableStreamForm):  # type: ignore
         ], heading="Dates"),
         FieldPanel('reviewers'),
         ReadOnlyPanel('get_workflow_name_display', heading="Workflow"),
+        # Forms comes from parental key in models/forms.py
         ReadOnlyInlinePanel('forms', help_text="Are copied from the parent fund."),
+        ReadOnlyInlinePanel('review_forms', help_text="Are copied from the parent fund."),
     ]
 
     edit_handler = TabbedInterface([
@@ -156,13 +158,22 @@ class RoundBase(WorkflowStreamForm, SubmittableStreamForm):  # type: ignore
 
         if is_new and hasattr(self, 'parent_page'):
             # Would be nice to do this using model clusters as part of the __init__
-            for form in self.parent_page.forms.all():
-                # Create a copy of the existing form object
-                new_form = form.form
-                new_form.id = None
-                new_form.name = '{} for {} ({})'.format(new_form.name, self.title, self.get_parent().title)
-                new_form.save()
-                RoundBaseForm.objects.create(round=self, form=new_form)
+            self._copy_forms('forms')
+            self._copy_forms('review_forms')
+
+    def _copy_forms(self, field):
+        for form in getattr(self.parent_page, field).all():
+            new_form = self._meta.get_field(field).related_model
+            self._copy_form(form, new_form)
+
+    def _copy_form(self, form, new_class):
+        # Create a copy of the existing form object
+        new_form = form.form
+        new_form.id = None
+        new_form.name = '{} for {} ({})'.format(new_form.name, self.title, self.get_parent().title)
+        new_form.save()
+        new_class.objects.create(round=self, form=new_form)
+
 
     def get_submit_meta_data(self, **kwargs):
         return super().get_submit_meta_data(
diff --git a/opentech/apply/funds/models/forms.py b/opentech/apply/funds/models/forms.py
index 41f6fb32b..0eaba0798 100644
--- a/opentech/apply/funds/models/forms.py
+++ b/opentech/apply/funds/models/forms.py
@@ -90,5 +90,9 @@ class ApplicationBaseReviewForm(AbstractRelatedReviewForm):
     application = ParentalKey('ApplicationBase', related_name='review_forms')
 
 
+class RoundBaseReviewForm(AbstractRelatedReviewForm):
+    round = ParentalKey('RoundBase', related_name='review_forms')
+
+
 class LabBaseReviewForm(AbstractRelatedReviewForm):
     lab = ParentalKey('LabBase', related_name='review_forms')
-- 
GitLab