From fc00482bf416118a2304eb92d32c0f8bec4a8d1e Mon Sep 17 00:00:00 2001
From: Parbhat Puri <parbhatpuri17@gmail.com>
Date: Fri, 25 Jan 2019 15:03:28 +0000
Subject: [PATCH] Exclude non-text answers like attachment from compare
 revisions

---
 opentech/apply/funds/models/mixins.py | 20 +++++++++++++++++++-
 opentech/apply/funds/views.py         | 10 +++++-----
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py
index 31a5b899a..1edb02f14 100644
--- a/opentech/apply/funds/models/mixins.py
+++ b/opentech/apply/funds/models/mixins.py
@@ -3,7 +3,9 @@ from django.utils.text import mark_safe
 from django.core.files import File
 from django.core.files.storage import get_storage_class
 
-from opentech.apply.stream_forms.blocks import FormFieldBlock
+from opentech.apply.stream_forms.blocks import (
+    FileFieldBlock, FormFieldBlock, ImageFieldBlock, MultiFileFieldBlock
+)
 from opentech.apply.utils.blocks import SingleIncludeMixin
 
 from opentech.apply.stream_forms.blocks import UploadableMediaBlock
@@ -112,6 +114,14 @@ class AccessFormData:
             if isinstance(field.block, FormFieldBlock):
                 yield field_id
 
+    @property
+    def question_text_field_ids(self):
+        for field_id, field in self.fields.items():
+            if isinstance(field.block, (FileFieldBlock, ImageFieldBlock, MultiFileFieldBlock)):
+                pass
+            elif isinstance(field.block, FormFieldBlock):
+                yield field_id
+
     @property
     def raw_fields(self):
         # Field ids to field class mapping - similar to raw_data
@@ -168,6 +178,14 @@ class AccessFormData:
             for field_id in self.normal_blocks
         ]
 
+    def render_text_blocks_answers(self):
+        # Returns a list of the rendered answers of type text
+        return [
+            self.render_answer(field_id, include_question=True)
+            for field_id in self.question_text_field_ids
+            if field_id not in self.named_blocks
+        ]
+
     def output_answers(self):
         # Returns a safe string of the rendered answers
         return mark_safe(''.join(self.render_answers()))
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index b75cf1232..9d0376b7d 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -462,11 +462,11 @@ class RevisionCompareView(DetailView):
 
     def compare_revisions(self, from_data, to_data):
         self.object.form_data = from_data.form_data
-        from_fields = self.object.render_answers()
+        from_rendered_text_fields = self.object.render_text_blocks_answers()
         from_required = self.render_required()
 
         self.object.form_data = to_data.form_data
-        to_fields = self.object.render_answers()
+        to_rendered_text_fields = self.object.render_text_blocks_answers()
         to_required = self.render_required()
 
         # Compare all the required fields
@@ -478,12 +478,12 @@ class RevisionCompareView(DetailView):
             setattr(self.object, 'get_{}_display'.format(field), diff)
 
         # Compare all the answers
-        diffed_answers = [
+        diffed_text_fields_answers = [
             compare(*fields, should_bleach=False)
-            for fields in zip(from_fields, to_fields)
+            for fields in zip(from_rendered_text_fields, to_rendered_text_fields)
         ]
 
-        self.object.output_answers = mark_safe(''.join(diffed_answers))
+        self.object.output_answers = mark_safe(''.join(diffed_text_fields_answers))
 
     def render_required(self):
         return [
-- 
GitLab