From 2a622ef3262df07005dece190d46a0ba120c7b8d Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Thu, 21 Jun 2018 20:19:35 +0100
Subject: [PATCH] Add tests to remove the draft revision form the revision list

---
 opentech/apply/funds/differ.py                 |  5 ++++-
 .../templates/funds/revisions_compare.html     |  5 +++--
 opentech/apply/funds/tests/factories/models.py | 17 +++++++++++++----
 opentech/apply/funds/tests/test_views.py       | 18 ++++++++++++++++++
 opentech/apply/funds/views.py                  | 15 +++++----------
 5 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/opentech/apply/funds/differ.py b/opentech/apply/funds/differ.py
index cecc35bfe..7fe0f7ce9 100644
--- a/opentech/apply/funds/differ.py
+++ b/opentech/apply/funds/differ.py
@@ -74,6 +74,9 @@ def compare(answer_a, answer_b, should_bleach=True):
         if added:
             output.append(wrap_added(''.join(added)))
 
-    display = BeautifulSoup(''.join(output)).prettify()
+    display = ''.join(output)
+
+    if not should_bleach:
+        display = BeautifulSoup(display, "html5lib").prettify()
 
     return mark_safe(display)
diff --git a/opentech/apply/funds/templates/funds/revisions_compare.html b/opentech/apply/funds/templates/funds/revisions_compare.html
index d7efe80ba..4bf8952b2 100644
--- a/opentech/apply/funds/templates/funds/revisions_compare.html
+++ b/opentech/apply/funds/templates/funds/revisions_compare.html
@@ -3,11 +3,12 @@
 <div class="wrapper wrapper--breakout wrapper--admin">
     <div class="wrapper wrapper--medium">
         <h2 class="heading heading--no-margin">Comparing Revisions</h2>
-        <h5>For <a href="{% url "funds:submissions:detail" submission.id %}">{{ submission.title }}</a></h5>
+        <h5>For <a href="{% url "funds:submissions:detail" object.id %}">{{ object.title }}</a></h5>
+        <h5><a href="{% url "funds:submissions:revisions:list" object.id %}">Back to revisions</a></h5>
     </div>
 </div>
 
 <div class="wrapper wrapper--medium wrapper--tabs">
-    {% include "funds/includes/rendered_answers.html" with object=diff %}
+    {% include "funds/includes/rendered_answers.html" %}
 </div>
 {% endblock %}
diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py
index 5b4bf8599..ed198f6c0 100644
--- a/opentech/apply/funds/tests/factories/models.py
+++ b/opentech/apply/funds/tests/factories/models.py
@@ -102,8 +102,8 @@ class RoundFactory(wagtail_factories.PageFactory):
         model = Round
 
     title = factory.Sequence('Round {}'.format)
-    start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=n-1))
-    end_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=n))
+    start_date = factory.LazyFunction(datetime.date.today)
+    end_date = factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7))
     lead = factory.SubFactory(StaffFactory)
 
     @factory.post_generation
@@ -118,6 +118,11 @@ class RoundFactory(wagtail_factories.PageFactory):
                 )
 
 
+class TodayRoundFactory(RoundFactory):
+    start_date = factory.LazyFunction(datetime.date.today)
+    end_date = factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7))
+
+
 class RoundFormFactory(AbstractRelatedFormFactory):
     class Meta:
         model = RoundForm
@@ -189,7 +194,7 @@ class FormDataFactory(factory.Factory, metaclass=Metaclass):
             form_data[form_definition[name]] = answer
 
         if clean:
-            application = ApplicationSubmissionFactory()
+            application = ApplicationSubmissionFactory(round=Round.objects.first())
             application.form_fields = form_fields
             application.form_data = form_data
             application.save()
@@ -223,7 +228,11 @@ class ApplicationSubmissionFactory(factory.DjangoModelFactory):
     form_data = factory.SubFactory(FormDataFactory, form_fields=factory.SelfAttribute('..form_fields'))
     page = factory.SubFactory(FundTypeFactory)
     workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1])
-    round = factory.SubFactory(RoundFactory, workflow_name=factory.SelfAttribute('..workflow_name'), lead=factory.SelfAttribute('..lead'))
+    round = factory.SubFactory(
+        RoundFactory,
+        workflow_name=factory.SelfAttribute('..workflow_name'),
+        lead=factory.SelfAttribute('..lead'),
+    )
     user = factory.SubFactory(UserFactory)
     lead = factory.SubFactory(StaffFactory)
     live_revision = None
diff --git a/opentech/apply/funds/tests/test_views.py b/opentech/apply/funds/tests/test_views.py
index fe985c434..c746317a5 100644
--- a/opentech/apply/funds/tests/test_views.py
+++ b/opentech/apply/funds/tests/test_views.py
@@ -131,3 +131,21 @@ class TestRevisionsView(BaseSubmissionViewTestCase):
         self.assertEqual(submission.revisions.count(), 2)
         self.assertDictEqual(submission.draft_revision.form_data, submission.from_draft().form_data)
         self.assertDictEqual(submission.live_revision.form_data, old_data)
+
+
+class TestRevisionList(BaseSubmissionViewTestCase):
+    base_view_name = 'revisions:list'
+    user_factory = StaffFactory
+
+    def get_kwargs(self, instance):
+        return {'submission_pk': instance.pk}
+
+    def test_list_doesnt_include_draft(self):
+        submission = ApplicationSubmissionFactory()
+        draft_revision = ApplicationRevisionFactory(submission=submission)
+        submission.draft_revision = draft_revision
+        submission.save()
+
+        response = self.get_page(submission)
+
+        self.assertNotIn(draft_revision, response.context['object_list'])
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index fe01f4f21..42a9561a9 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -250,7 +250,7 @@ class RevisionListView(ListView):
 
     def get_queryset(self):
         self.submission = get_object_or_404(ApplicationSubmission, id=self.kwargs['submission_pk'])
-        self.queryset = self.model.objects.filter(submission=self.submission)
+        self.queryset = self.model.objects.filter(submission=self.submission).exclude(id=self.submission.draft_revision.id)
         return super().get_queryset()
 
 
@@ -281,16 +281,11 @@ class RevisionCompareView(DetailView):
             compare(*fields, should_bleach=False)
             for fields in zip(from_fields, to_fields)
         ]
-        to_data.form_data = diffed_form_data
-        to_data.render_answers = mark_safe(''.join(diffed_answers))
-        return to_data
+        self.object.form_data = diffed_form_data
+        self.object.render_answers = mark_safe(''.join(diffed_answers))
 
     def get_context_data(self, **kwargs):
         from_revision = self.object.revisions.get(id=self.kwargs['from'])
         to_revision = self.object.revisions.get(id=self.kwargs['to'])
-        diff = self.compare_revisions(from_revision, to_revision)
-        return super().get_context_data(
-            submission=ApplicationSubmission.objects.get(id=self.kwargs['submission_pk']),
-            diff=diff,
-            **kwargs,
-        )
+        self.object = self.compare_revisions(from_revision, to_revision)
+        return super().get_context_data(**kwargs)
-- 
GitLab