From 48e6f7cc104b113e01bc87872793fce758e31fb7 Mon Sep 17 00:00:00 2001
From: Fredrik Jonsson <frjo@xdeb.org>
Date: Tue, 23 Apr 2019 09:09:00 +0200
Subject: [PATCH] Allow review author to delete a review. Review object have no
 title so just use object in template to write out str value.

---
 .../templates/review/review_confirm_delete.html  |  4 ++--
 .../review/templates/review/review_detail.html   | 16 ++++++++--------
 opentech/apply/review/views.py                   | 11 ++++++++---
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/opentech/apply/review/templates/review/review_confirm_delete.html b/opentech/apply/review/templates/review/review_confirm_delete.html
index 227b09d50..5084d5cc4 100644
--- a/opentech/apply/review/templates/review/review_confirm_delete.html
+++ b/opentech/apply/review/templates/review/review_confirm_delete.html
@@ -1,11 +1,11 @@
 {% extends "base-apply.html" %}
 
-{% block title %}Deleting: {{object.title }}{% endblock %}
+{% block title %}Deleting: {{ object }}{% endblock %}
 
 {% block content %}
 <div class="admin-bar">
     <div class="admin-bar__inner">
-        <h2 class="heading heading--no-margin">Deleting: {{ object.title }}</h2>
+        <h2 class="heading heading--no-margin">Deleting: {{ object }}</h2>
     </div>
 </div>
 
diff --git a/opentech/apply/review/templates/review/review_detail.html b/opentech/apply/review/templates/review/review_detail.html
index 75f0743e0..cfbdd6f33 100644
--- a/opentech/apply/review/templates/review/review_detail.html
+++ b/opentech/apply/review/templates/review/review_detail.html
@@ -24,6 +24,14 @@
         <svg class="icon icon--eye"><use xlink:href="#eye"></use></svg>
         {{ review.get_visibility_display }}
     </div>
+    {% if perms.funds.delete_review or request.user == review.author %}
+        <div>
+            <a class="link link--delete-review is-active" href="{% url 'apply:submissions:reviews:delete' submission_pk=object.submission.id pk=object.id %}">
+                Delete
+                <svg class="icon icon--delete"><use xlink:href="#delete"></use></svg>
+            </a>
+        </div>
+    {% endif %}
     {% if not review.for_latest %}
         <div>
             <h5>Review was not against the latest version:</h5>
@@ -32,14 +40,6 @@
             </p>
         </div>
     {% endif %}
-    {% if perms.funds.delete_review %}
-        <div>
-            <a class="link link--delete-review is-active" href="{% url 'apply:submissions:reviews:delete' submission_pk=object.submission.id pk=object.id %}">
-                Delete
-                <svg class="icon icon--delete"><use xlink:href="#delete"></use></svg>
-            </a>
-        </div>
-    {% endif %}
 </div>
 
 <div class="rich-text rich-text--answers">
diff --git a/opentech/apply/review/views.py b/opentech/apply/review/views.py
index cd7721378..c069a06b8 100644
--- a/opentech/apply/review/views.py
+++ b/opentech/apply/review/views.py
@@ -1,6 +1,7 @@
 from collections import defaultdict
 
-from django.contrib.auth.decorators import login_required, permission_required
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.mixins import UserPassesTestMixin
 from django.core.exceptions import PermissionDenied
 from django.http import HttpResponseRedirect
 from django.shortcuts import get_object_or_404
@@ -282,9 +283,13 @@ class ReviewListView(ListView):
         )
 
 
-@method_decorator(permission_required('review.delete_review', raise_exception=True), name='dispatch')
-class ReviewDeleteView(DeleteView):
+class ReviewDeleteView(UserPassesTestMixin, DeleteView):
     model = Review
+    raise_exception = True
+
+    def test_func(self):
+        review = self.get_object()
+        return self.request.user.has_perm('review.delete_review') or self.request.user == review.author
 
     def delete(self, request, *args, **kwargs):
         review = self.get_object()
-- 
GitLab