From 74603261952e0f5b150a58403a7929e7bea0694a Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Tue, 12 Nov 2019 16:48:37 +0000
Subject: [PATCH] avoid skipping the current report for data integrity reasons

---
 .../includes/report_line.html                 |  2 +
 hypha/apply/projects/tests/test_views.py      | 50 ++++++++++++++++++-
 hypha/apply/projects/views/report.py          |  4 +-
 3 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/hypha/apply/projects/templates/application_projects/includes/report_line.html b/hypha/apply/projects/templates/application_projects/includes/report_line.html
index b1782b17e..433d7ad94 100644
--- a/hypha/apply/projects/templates/application_projects/includes/report_line.html
+++ b/hypha/apply/projects/templates/application_projects/includes/report_line.html
@@ -32,6 +32,7 @@
                     <p>You're skipping the report for <b>{{report.start_date}}</b> &ndash; <b>{{report.end_date}}</b></p>
                     <p>This will result in a gap in reporting for the project. You can undo this at any time.</p>
                 </div>
+                {% if not current %}
                 <form action="{% url "apply:projects:reports:skip" pk=report.pk %}" method="post">
                     {% csrf_token %}
                     <div class="modal__buttons">
@@ -39,6 +40,7 @@
                         <button data-fancybox-close class="button button--submit button--white">Cancel</button>
                     </div>
                 </form>
+                {% endif %}
             </div>
 
         {% endif %}
diff --git a/hypha/apply/projects/tests/test_views.py b/hypha/apply/projects/tests/test_views.py
index 7e5b1e8b9..c095677bc 100644
--- a/hypha/apply/projects/tests/test_views.py
+++ b/hypha/apply/projects/tests/test_views.py
@@ -1428,10 +1428,10 @@ class TestStaffReportDetail(BaseViewTestCase):
         response = self.get_page(report)
         self.assertEqual(response.status_code, 200)
 
-    def test_can_access_skipped_report(self):
+    def test_cant_access_skipped_report(self):
         report = ReportFactory(skipped=True)
         response = self.get_page(report)
-        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.status_code, 404)
 
     def test_cant_access_draft_report(self):
         report = ReportFactory(is_draft=True)
@@ -1483,3 +1483,49 @@ class TestApplicantReportDetail(BaseViewTestCase):
         report = ReportFactory(end_date=timezone.now() + relativedelta(days=1))
         response = self.get_page(report)
         self.assertEqual(response.status_code, 404)
+
+
+class TestSkipReport(BaseViewTestCase):
+    base_view_name = 'skip'
+    url_name = 'funds:projects:reports:{}'
+    user_factory = StaffFactory
+
+    def get_kwargs(self, instance):
+        return {
+            'pk': instance.pk,
+        }
+
+    def test_can_skip_report(self):
+        report = ReportFactory(past_due=True)
+        response = self.post_page(report)
+        self.assertEqual(response.status_code, 200)
+        report.refresh_from_db()
+        self.assertTrue(report.skipped)
+
+    def test_can_unskip_report(self):
+        report = ReportFactory(skipped=True, past_due=True)
+        response = self.post_page(report)
+        self.assertEqual(response.status_code, 200)
+        report.refresh_from_db()
+        self.assertFalse(report.skipped)
+
+    def test_cant_skip_current_report(self):
+        report = ReportFactory(end_date=timezone.now() + relativedelta(days=1))
+        response = self.post_page(report)
+        self.assertEqual(response.status_code, 200)
+        report.refresh_from_db()
+        self.assertFalse(report.skipped)
+
+    def test_cant_skip_submitted_report(self):
+        report = ReportFactory(is_submitted=True)
+        response = self.post_page(report, data={})
+        self.assertEqual(response.status_code, 200)
+        report.refresh_from_db()
+        self.assertFalse(report.skipped)
+
+    def test_can_skip_draft_report(self):
+        report = ReportFactory(is_draft=True, past_due=True)
+        response = self.post_page(report)
+        self.assertEqual(response.status_code, 200)
+        report.refresh_from_db()
+        self.assertTrue(report.skipped)
diff --git a/hypha/apply/projects/views/report.py b/hypha/apply/projects/views/report.py
index da0642443..ea23fc9e5 100644
--- a/hypha/apply/projects/views/report.py
+++ b/hypha/apply/projects/views/report.py
@@ -153,7 +153,9 @@ class ReportSkipView(SingleObjectMixin, View):
 
     def post(self, *args, **kwargs):
         report = self.get_object()
-        if not report.current:
+        unsubmitted = not report.current
+        not_current = report.project.report_config.current_due_report() != report
+        if unsubmitted and not_current:
             report.skipped = not report.skipped
             report.save()
             messenger(
-- 
GitLab